2013-08-01 37 views
1

我已經實現了一個像這樣的過濾器,但只有當請求進入時纔會觸發。我想攔截響應,即當響應從控制器返回。Java:如何從控制器返回過濾器後得到攔截器

我知道Spring攔截器,它給你的功能來處理請求之前和之後,它擊中控制器。我想要做那樣的事情。

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 

} 

}

+2

將代碼放在chain.doFilter()之後,您希望在出路時執行該代碼。 – samlewis

回答

4

doFilter()就是奇蹟發生。不管你在servlet之前執行什麼操作,以及在servlet方法返回(包括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"); 
} 

這種方式,你可以換的ServletRequestServletResponse對象與自己的實現添加功能,例如:壓縮。

請注意,在執行處理程序方法之前和之後調用Spring Interceptor。在Servlet之前和之後執行servlet Filter

+0

謝謝......難怪這是一些魔法。無法相信它,直到我調試它 –

+0

[FilterChain.doFilter](https://docs.oracle.com/javaee/7/api/javax/servlet/FilterChain.html#doFilter-javax.servlet.ServletRequest-javax .servlet.ServletResponse-)支持答案。 –

+0

請注意,在doFilter()之後,不要嘗試改變任何對響應的響應(更改Headers,添加cookie等),因爲響應很可能已經提交併且您的操作將不起作用 – sam