0

我有一个简单的基于 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);    
}
4

1 回答 1

0

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

于 2014-03-18T04:20:38.320 回答