總而言之,Filter可以擔任瀏覽器與JSP/Servlet之間的一個中介處理者,一些request的前置處理動作又一些response的後置處理,都可以交由這個中介處理者來完成,當然Filter可以達到的功能,我們也可以直接撰寫在JSP/Servlet中,但如果有很多JSP/Servlet都需要相同的處理,例如某些網頁都需要統一的身份驗證方式時,與其在每一個網頁中都撰寫驗證的程式碼,我們不如直接撰寫Filter,讓它來統一進行處理。
最近在測試Web Cache的行為,發現寫在Filter裡面的header最後能在回應標頭看到你所設定的結果。 如果在一般JSP的頁面加上Meta的Tags或使用response.setHeader的方式,在回應標頭都無法看到你所設定的結果。 但二者的快取效果都是一樣的。
@Override
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//HttpServletRequest hsresq = (HttpServletRequest) request;
HttpServletResponse hsresp = (HttpServletResponse)response;
//current request server url(Don't include host and sitename)
//String currentURL = hsresq.getServletPath();
hsresp.setHeader("Pragma","no-cache");
hsresp.setHeader("Cache-Control","no-cache,no-store,must-revalidate");
//prevents caching at the proxy server
hsresp.setDateHeader("Expires", 0);
chain.doFilter(request, response);
}
在web.xml設定只對jsp的頁面進行filter,注意url-pattern設定成/*.jsp是錯誤的。
<filter>
<filter-name>JSPNoCacheFilter</filter-name>
<filter-class>filter.JSPNoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>JSPNoCacheFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
Reference:JSP Servlet Filter-1
沒有留言:
張貼留言
留個話吧:)