filter 作用


 過濾器

filter用於攔截用戶請求,在服務器作出響應前,可以在攔截后修改request和response,這樣實現很多開發者想得到的功能。

filter是一個可以復用的代碼片段,可以用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求,或者修改從某一的響應。 

一個過濾器是一個可以傳送請求或修改響應的對象。過濾器並不是servlet,他們並不實際創建一個請求。他們是請求到達一個servlet前的預處理程序,和/或響應離開servlet后的后處理程序。一個過濾器能夠:
·在一個servlet被調用前截獲該調用
·在一個servlet被調用前檢查請求
·修改在實際請求中提供了可定制請求對象的請求頭和請求數據
·修改在實際響應中提供了可定制響應對象的響應頭和響應數據
·在一個servlet被調用之后截獲該調用
 
    一個過濾器以作用於一個或一組servlet,零個或多個過濾器能過濾一個或多個servlet。一個過濾器需要實現java.servlet.Filter接口,並定義它的三個方法:
1.              void init(FilterConfig config) throws ServletException:在過濾器執行service前被調用,以設置過濾器的配置對象。
2.              void destroy();在過濾器執行service后被調用。
3.              Void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException;執行實際的過濾工作。
 
服務器調用一次init(FilterConfig)以為服務准備過濾器,然后在請求需要使用過濾器的任何時候調用doFilter()。FilterConfig接口檢索過濾器名、初始化參數以及活動的servlet上下文。服務器調用destory()以指出過濾器已結束服務。過濾器的生命周期和servelt的生命周期非常相似 ——在Servlet API 2.3 最終發布稿2號 中最近改變的。先前得用setFilterConfig(FilterConfig)方法來設置生命周期。
 
在doFilter()方法中,每個過濾器都接受當前的請求和響應,而FilterChain包含的過濾器則仍然必須被處理。doFilter()方法中,過濾器可以對請求和響應做它想做的一切。(就如我將在后面討論的那樣,通過調用他們的方法收集數據,或者給對象添加新的行為。)過濾器調用
chain.doFilter()將控制權傳送給下一個過濾器。當這個調用返回后,過濾器可以在它的doFilter()方法的最后對響應做些其他的工作;例如,它能記錄響應的信息。如果過濾器想要終止請求的處理或得對響應的完全控制,則他可以不調用下一個過濾器。
 

常見用法

處理全站中文亂碼問題

實現自動登錄

過濾敏感詞匯

壓縮網頁

選擇性讓瀏覽器緩存

這幾種功能的實現采用同樣的原理,那就是使用包裝模式或動態代理增強request或response對象的功能。

Servlet和filter的區別

1,servlet 流程是短的,url傳來之后,就對其進行處理,之后返回或轉向到某一自己指定的頁面。它主要用來在 業務處理之前進行控制.
2,filter 流程是線性的, url傳來之后,檢查之后,可保持原來的流程繼續向下執行,被下一個filter, servlet接收等,而servlet 處理之后,不會繼續向下傳遞。filter功能可用來保持流程繼續按照原來的方式進行下去,或者主導流程,而servlet的功能主要用來主導流程。
filter可用來進行字符編碼的過濾,檢測用戶是否登陸的過濾,禁止頁面緩存等。

demo演示

步驟一:新建comment.jsp頁面

 

  1. <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <html>
  3. <head>
  4. <title>評論</title>
  5. </head>
  6. <body>
  7.     <form action="comment" method="post">
  8.         <fieldset>
  9.             <legend>評論</legend>
  10.             請輸入評論:<textarea name="comment"
  11.             style="vertical-align:middle;
  12.             width:140px;height:55px"></textarea><Br>
  13.             <input type="submit" value="發表評論" />
  14.         </fieldset>
  15.     </form>
  16. </body>
  17. </html>

步驟二:新建CommentServlet.java文件

  1. package web;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. public class CommentServlet extends HttpServlet {
  9.     public void service(HttpServletRequest request,
  10.                         HttpServletResponse response)
  11.                         throws ServletException, IOException {
  12.         request.setCharacterEncoding("UTF-8");
  13.         response.setContentType("text/html;charset=UTF-8");
  14.         PrintWriter out = response.getWriter();
  15.         //獲取評論內容
  16.         String str = request.getParameter("comment");
  17.         //顯示評論內容
  18.         out.println("<h3>評論內容:" + str + "</h3>");
  19.         out.close();
  20.     }
  21. }

 

步驟三:新建CommentFilter類

  1. package web;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.Filter;
  5. import javax.servlet.FilterChain;
  6. import javax.servlet.FilterConfig;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletRequest;
  9. import javax.servlet.ServletResponse;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. public class CommentFilter1 implements Filter{
  13.     private String illegalWord;
  14.     
  15.     /**
  16.      * 容器刪除過濾器實例之前調用,只執行一次
  17.      */
  18.     public void destroy() {
  19.                 
  20.     }
  21.     
  22.     /**
  23.      * 用於處理請求的主要方法
  24.      */
  25.     public void doFilter(ServletRequest request, ServletResponse response,
  26.             FilterChain chain) throws IOException, ServletException {
  27.         HttpServletRequest req = (HttpServletRequest)request;
  28.         HttpServletResponse resp = (HttpServletResponse)response;
  29.         req.setCharacterEncoding("UTF-8");
  30.         resp.setContentType("text/html;charset=UTF-8");
  31.         PrintWriter out = resp.getWriter();
  32.         String comment = req.getParameter("comment");
  33.         if(comment.indexOf("damn")!=-1){
  34.             //有敏感詞匯
  35.             out.print("<h3>評論內容已關閉</h3>");
  36.         }else{
  37.             //沒有敏感詞匯則向后處理,交給其他過濾器或Servlet
  38.             chain.doFilter(req, resp);
  39.         }
  40.     }
  41.     
  42.     /**
  43.      * 容器啟動之后,創建過濾器實例
  44.      * 然后調用init方法,只會調用一次
  45.      * 容器會將已經創建好的FilterConfig對象作為參數傳入
  46.      * 可以從該參數中獲取初始化的配置信息
  47.      */
  48.     public void init(FilterConfig filterConfig) throws ServletException {
  49.         illegalWord = filterConfig.getInitParameter("illegalWord");
  50.         System.out.println("Filter1:init is runnming... " + illegalWord);
  51.         
  52.     }
  53.     
  54. }

步驟四:配置CommentFilter過濾器

web.xml文件代碼:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5"
  3.     xmlns="http://java.sun.com/xml/ns/javaee"
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7. <display-name></display-name>
  8. <!-- 過濾器 -->
  9. <filter>
  10.     <filter-name>filter1</filter-name>
  11.     <filter-class>web.CommentFilter1</filter-class>    
  12. </filter>
  13. <filter-mapping>
  14.     <filter-name>filter1</filter-name>
  15.     <url-pattern>/comment</url-pattern>
  16. </filter-mapping>
  17. <!-- Servlet -->
  18. <servlet>
  19. <servlet-name>CommentServlet</servlet-name>
  20. <servlet-class>web.CommentServlet</servlet-class>
  21. </servlet>
  22. <servlet-mapping>
  23. <servlet-name>CommentServlet</servlet-name>
  24. <url-pattern>/comment</url-pattern>
  25. </servlet-mapping>
  26. </web-app>

步驟五:部署應用,輸入評論查看結果

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM