的逻辑是,所述过滤器被击中,条件是不正确的,所以它穿过过滤器链。响应被提交后,过滤器被击中,而现在的情况是真实的(一个请求属性设置)。它去在执行前,但页面永远向前。我知道这事做的响应,因为我测试它转发它击中链首次之前不同的逻辑被提交,它也成功地向前

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

    HttpServletRequest httpServletRequest = (HttpServletRequest)request;

    if (some condition equals true) {
        httpServletRequest.getRequestDispatcher("/home.jsp").forward(request, response);
        return;
    } else {
        chain.doFilter(request, response);
    }
}

实施例从我的部署描述符:

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.filters.MyFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
    <dispatcher>REQUEST</dispatcher>  
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping>
有帮助吗?

解决方案

这是HttpServletResponse的“承诺”的地位实在是说是否响应头已被写入底层套接字的一种方式。 “犯”的反应已经有(至少)第一行写的。由于响应的第一行包含状态代码,它遵循的是你不能改变一个坚定的响应的状态代码...这意味着它是来不及的状态更改为3xx的做重定向。同样的,你不能做一个本土前锋,因为你已经开始发送响应。

其他提示

可以达到你想要的东西通过使用自定义 HttpServletResponse的。你通过这个包裹的HttpServletResponse下来的过滤器链。您可以提供本地的OutputStream,存储所有的写请求,本地变量来存储状态代码和头文件。一旦你回到你的过滤器,你可以决定是否执行重定向或从包装中的局部变量拷贝回结果到原来的ServletResponse(即设置状态代码和头,结果从本地输出流复制到servlet响应的输出流)。

编辑:

参阅编程定制请求和响应部分,用于其使用CharResponseWrapper的代码示例。该示例使用定制写入器,但它可以很容易地扩展到OutputStream。根据你的servlet是如何使用的,你需要重写一个或两个getWriter()getOutputStream()的推迟提交任何到原来的响应。此外,你需要重写isCommitted()来回报false,使得前可以随时下来的过滤器链执行。您还需要重写resetBuffer()初始化新OutputStream / Writer到重定向后/新内容(包括标题)存储着。

scroll top