Spring MVC,Google App Engine以及HEAD请求的过滤

时间:2014-03-17 15:59:23

标签: java spring google-app-engine spring-mvc http-head

我在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);    
}

1 个答案:

答案 0 :(得分:0)

这似乎是Google App Engine的一个已知问题: https://code.google.com/p/googleappengine/issues/detail?id=2719