javaweb繼承第十二課:過濾器
阿新 • • 發佈:2018-12-27
這節課我們來講講過濾器Filter
Servlet 過濾器可以動態地攔截請求和響應,以變換或使用包含在請求或響應中的資訊。
可以將一個或多個 Servlet 過濾器附加到一個 Servlet 或一組 Servlet。Servlet 過濾器也可以附加到 Java Server Pages (JSP) 檔案和 HTML 頁面。呼叫 Servlet 前呼叫所有附加的 Servlet 過濾器。
Servlet 過濾器是可用於 Servlet 程式設計的 Java 類,可以實現以下目的:
- 在客戶端的請求訪問後端資源之前,攔截這些請求。
- 在伺服器的響應傳送回客戶端之前,處理這些響應。
我們來學習怎麼定義或者說建立過濾器
package com.filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; /** * 建立Filter步驟: * 1. 定義一個類實現javax.servlet.Filter介面 * 2. 重寫抽象方法 * 3. 在web.xml裡配置這個filter */public class TeachFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } /** * * @param servletRequest request物件 * @paramservletResponse response物件 * @param filterChain 過濾器鏈,用於決定是否放行 * @throws IOException * @throws ServletException */ @Override /** * 說明一下,ServletRequest是HttpServletRequest的父介面 * HttpServletRequest可以通過getRequestURL()方法來獲取請求路徑,返回物件是StringBuffer型別,可通過toString()方法轉成字串 * ServletRequest並沒有可以用來獲取請求路徑的方法 */ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { /** * instanceof關鍵字: 作用是判斷左邊的物件是否是右邊的型別 */ if(servletRequest instanceof HttpServletRequest) { String url = ((HttpServletRequest) servletRequest).getRequestURL().toString(); System.out.println("目前過濾的是 '" + url + "' 路徑"); } else { System.out.println("這不是一個Http請求"); } //可以發現它只是執行了這個方法的程式碼,但好像沒有 放行,即servlet或者jsp的程式碼沒執行 //所以,filter是在servlet之前執行的 //放行程式碼: filterChain.doFilter(servletRequest,servletResponse); //filterChain是過濾器鏈,在引數裡 //可以看到添加了這行程式碼後,頁面就顯示出來了 } @Override public void destroy() { } }
下面寫個具體應用:字元編碼過濾器
package com.filter; import javax.servlet.*; import java.io.IOException; //寫完了別忘了在web.xml裡配置一下 //這個字元編碼過濾器等下注冊功能要用 public class CharacterEncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("這是字元編碼過濾器"); servletRequest.setCharacterEncoding("UTF-8"); servletResponse.setCharacterEncoding("UTF-8"); filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { } }
web.xml配置filter
<!--配置Filter--> <filter> <filter-name>TeachFilter</filter-name> <filter-class>com.filter.TeachFilter</filter-class> </filter> <filter-mapping> <filter-name>TeachFilter</filter-name> <!-- /* 表示所有請求, java中級會講正則表示式,到時候就懂了--> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>com.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
注意:
對於同一請求所有過濾器都會起作用(當然要加filterChain.doFilter()),執行順序是配置filter-mapping的順序
如果過濾器的doFilter方法裡沒有寫filterChain.doFilter(req,resp)則不會繼續往後執行,也就是起到了過濾的功能