java filter過濾器及責任鏈設計模式


 什么是Filter?

  Filter屬於sevlet規范,翻譯為過濾器。

  Filter在web開發中有什么作用?

案例一:一個web站點只有用戶登錄才能繼續訪問該站點的資源,那么需要用戶每次訪問都判斷是否登陸,若在每個servlet中都寫上登陸判斷安全控制代碼,代碼冗余,復用性差,Filter可以很好的解決這個問題。

案例二:一個web站點當中的所有post請求都有可能出現中文亂碼問題,所有post請求我們都需要設置字符集,request.setCharacterEncoding("UTF-8");代碼無法重復利用。

上圖:

javaweb開發如何編寫一個Filter?

 首先 編寫一個類實現javax.servlet.Filter接口並實現其中的方法

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class FirstFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //System.out.println("FirstFilter init...");
        //Filter在服務器啟動階段被實例化。並且調用init方法,init方法只執行一次,因為Filter只被實例化一次(單例的)
        Enumeration<String> names = filterConfig.getInitParameterNames();    
        while(names.hasMoreElements()){
            String name = names.nextElement();
            String value = filterConfig.getInitParameter(name);
            System.out.println(name + " = " + value);
        }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        
        System.out.println("FirstFilter doFilter begin...");
        //前端用戶只要發送一次請求,則執行一次doFilter方法
        //順着鏈條往下走,下一個目標是Filter則調用Filter的doFilter方法
        //順着鏈條往下走,下一個目標是Servlet則調用Servlet的service方法
        chain.doFilter(request, response);
        
        System.out.println("FirstFilter doFilter end...");
    }

    @Override
    public void destroy() {
        /**當長時間沒有用戶訪問,或者項目重新部署,或者服務器重新啟動的時候,會銷毀所有的Filter對象,
          *銷毀之前會先調用Filter對象的destroy方法,完成銷毀前的准備工作。也是只執行一次。*/
        System.out.println("FirstFilter destroy...");
    }
}

其次:在web.xml文件中對filter進行路徑映射配置,確定filer;攔截過濾哪些路徑   filter的優先級:在web.xml越靠上的優先級越高。

<filter>
        <filter-name>firstFilter</filter-name>
        <filter-class>com.bjpowernode.javaweb.web.filter.FirstFilter</filter-class>
        <!-- 在初始化參數當中指定了字符集為UTF-8 -->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>GBK</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>firstFilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>

Filter優先級天生比servlet高,Filter通過filter.chain進入鏈條的下一個環節,在服務器啟動階段動態組合鏈條,符合責任鏈設計模式(動態調用,組合依賴於配置)。

這樣最簡單的一個fiter過濾器就完成了,我們可以在執行servlet之前在filter里面添加我們需要的業務邏輯,過濾字符集,添加登陸安全控制等等...

                                                  如有不足,歡迎指正。

 


免責聲明!

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



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