我在Google App Engine上托管了一个简单的基于Spring MVC 3.2的应用程序。控制器为GET请求返回ModelAndView对象,页面使用JSP。
我没有使用HEAD请求的处理程序来检测每个Controller,而是按照此博客上的说明创建了一个过滤器: http://axelfontaine.com/blog/http-head.html
它的工作原理,除了永远不会设置内容长度并返回为0.使用断点,我确认NoBodyOutputStream类中的write方法没有被调用,并且在检查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);
}
答案 0 :(得分:0)
这似乎是Google App Engine的一个已知问题: https://code.google.com/p/googleappengine/issues/detail?id=2719