我有一个简单的基于 Spring MVC 3.2 的应用程序托管在 Google App Engine 上。控制器为 GET 请求返回 ModelAndView 对象,页面使用 JSP。
我没有使用 HEAD 请求的处理程序来检测每个控制器,而是按照此博客上的说明创建了一个过滤器: http: //axelfontaine.com/blog/http-head.html
它工作,除了内容长度从未设置并返回为 0。使用断点,我确认没有调用 NoBodyOutputStream 类中的写入方法,并且在检查 ServletOutputStream 及其基类的源代码时,我做到了找不到其他会被调用的写入方法(不过,这可能是我的疏忽)。
有没有人在 Spring MVC 的更新版本中成功使用过滤器处理 HEAD 请求?
编辑
GAE 使用嵌入式 Jetty-6-1-x 服务器。
这是一个示例控制器:
@Controller
@RequestMapping("resources")
public class ResourcesController {
@RequestMapping(method = RequestMethod.GET)
public ModelAndView getResourcesPage() {
return new ModelAndView("resources");
}
}
以下是 web.xml 文件中的相关内容:
<filter>
<filter-name>HttpHeadFilter</filter-name>
<filter-class>com.foo.filter.HttpHeadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpHeadFilter</filter-name>
<servlet-name>mvc-dispatcher</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
我修改了HttpHeadFilter,问题似乎出在请求的包装方式上,因为调用了Controller的GET方法却没有写入响应:
if (isHttpHead(httpServletRequest)) {
chain.doFilter(new ForceGetRequestWrapper(httpServletRequest), response);
} else {
chain.doFilter(request, response);
}