是否可以转发或从一个Servlet过滤器重定向响应一直致力于后?
-
25-09-2019 - |
题
的逻辑是,所述过滤器被击中,条件是不正确的,所以它穿过过滤器链。响应被提交后,过滤器被击中,而现在的情况是真实的(一个请求属性设置)。它去在执行前,但页面永远向前。我知道这事做的响应,因为我测试它转发它击中链首次之前不同的逻辑被提交,它也成功地向前
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响应的输出流)。
编辑:
不隶属于 StackOverflow