Java:如何从控制器返回后对Filter进行拦截

Rau*_*wal 3 java servlets

我已经实现了这样的过滤器,但只有在请求进入时才会触发.我想在出路时拦截响应,即从控制器返回响应时.

我知道Spring Interceptor会给你在触及控制器之前和之后处理请求的功能.我想做那样的事情.

public class ServiceSessionManagementInterceptor implements Filter{

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    // TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest request, ServletResponse response,  FilterChain chain) throws IOException, ServletException {
    // TODO Auto-generated method stub
    Map<String, String[]> maps = request.getParameterMap();

    System.out.println("test");
chain.doFilter(request, response);  
}

@Override
public void destroy() {
    // TODO Auto-generated method stub

}
Run Code Online (Sandbox Code Playgroud)

}

Sot*_*lis 6

doFilter()是魔术发生的地方.无论你在它之前放置什么,它都将在servlet之前执行,你在它之后放的所有内容都将在servlet service()方法返回后执行(包括forward/include等).

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

    System.out.println("before");
    chain.doFilter(request, response);  
    System.out.println("after");
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以使用自己的实现来包装ServletRequestServletResponse对象以添加功能,例如:压缩.

请注意,Interceptor在执行处理程序方法之前和之后调用Spring .servlet Filter在a之前和之后执行Servlet.

  • 注意,此时不要尝试在 doFilter() 之后对响应进行任何更改(更改标题、添加 cookie 等),因为响应很可能已经提交并且您的操作将无效 (2认同)