總而言之,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
沒有留言:
張貼留言
留個話吧:)