Javaweb學習之過濾器(Filter)的使用
阿新 • • 發佈:2020-07-28
過濾器就是對web資源進行攔截,進行一些處理後再交給下一個過濾器或servlet,甚至直接交給客戶端或伺服器;可以攔截request進行處理的,也可以對返回的response進行攔截後處理。並且一個請求或一個響應都可以經過多層過濾器,如下圖所示:
用途
-
自動登入
-
設定統一的編碼格式,避免亂碼
-
訪問許可權的控制
-
進行敏感字元過濾(如經常遇到的不文明發言被過濾或者以“*”的形式顯示出來)
......
示例
這裡以一個servlet和一個filter作為示例。
servlet作為請求,向瀏覽器寫入一串中文字元,發生亂碼是意料之中的事情:
packageservlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class show extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException { /* resp.setContentType("text/html;charset=utf-8"); resp.setCharacterEncoding("UTF-8");*/ resp.getWriter().write("好久不見,你還好嗎?"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
servlet的註冊:
<servlet> <servlet-name>show</servlet-name> <servlet-class>servlet.show</servlet-class> </servlet> <servlet-mapping> <servlet-name>show</servlet-name> <url-pattern>/servlet/show</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>show</servlet-name> <url-pattern>/show</url-pattern> </servlet-mapping>
這裡設定兩個路徑是為了方便測試過濾器是否起作用。下面的過濾器註冊的路徑是/servlet/*,意味著/servlet路徑下面的頁面才能實現過濾器。
當然,上述的servlet可以使用程式碼中被註釋掉的部分進行編碼的設定,防止亂碼的發生。但此種方法需要無意義地重複,不推薦使用。而過濾器就可以完成這項工作。
使用步驟
-
新建一個類,實現Filter介面
-
重寫三個方法
-
在web.xml中註冊(或使用註解)
需要重寫的三個方法的作用:
void init(FilterConfig var1) throws ServletException; //過濾器初始化,在伺服器啟動時就自動執行了。
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; //過濾器的主體部分,過濾的程式碼在這裡編寫。
void destroy(); //過濾器的銷燬,在伺服器關閉時實現。
package filter; import javax.servlet.*; import java.io.IOException; public class Encode implements Filter { public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter 初始化"); } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;charset=utf-8"); System.out.println("過濾器執行前"); filterChain.doFilter(servletRequest,servletResponse); System.out.println("過濾器執行後"); } public void destroy() { System.out.println("Filter 已被銷燬"); } }
最後是註冊,完成後即可使用:
<filter> <filter-name>Encode</filter-name> <filter-class>filter.Encode</filter-class> </filter> <filter-mapping> <filter-name>Encode</filter-name> <url-pattern>/servlet/*</url-pattern> </filter-mapping>