JavaWeb Filter淺析

一、Filter簡介

Filter,過濾器,用於在servlet以外對request 和response 進行修改。Filter 有一個 FilterChain 的概念,一個FilterChain 包括多個 Filter。客戶端請求 request在抵達servlet 以前,會通過 FilterChain 裏面全部的 Filter,服務器響應 response 從servlet抵達客戶端瀏覽器以前也會通過 FilterChain 裏面全部的 Filter 。java

過濾器是處於客戶端與服務器資源文件之間的一道過濾網,在訪問資源文件以前,經過一系列的過濾器對請求進行修改、判斷等,把不符合規則的請求在中途攔截或修改。也能夠對響應進行過濾,攔截或修改響應。
如下是一張經典的過濾器鏈示意圖:瀏覽器

二、Filter應用場景

Filter通常用於:登陸權限驗證、資源訪問權限控制、敏感詞彙過濾、字符編碼轉換、壓縮響應信息等操做,便於代碼重用,沒必要每一個servlet中還要進行相應的操做。服務器

三、Filter實現步驟

自定義一個Filter須要實現如下操做:編碼

​ a.建立一個類實現javax.servlet.Filter接口;url

​ b.實現doFilter()方法;code

​ c.配置blog

四、Filter實例

如下是一個簡單的filter demo接口

@WebFilter(urlPatterns = "/myServlet2", initParams = {@WebInitParam(name = "username", value = "MyFilter")})
public class MyFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("---------doFilter-----------");
        System.out.println(req.getServletContext().getInitParameter("username"));
        resp.getWriter().println("---------doFilter-----------");
        chain.doFilter(req, resp);
        System.out.println("---------doFilter------over-----");
    }

    //filter初始化方法,經過FilterConfig能夠獲取到filter配置的初始化參數
    public void init(FilterConfig config) throws ServletException {
        Enumeration<String> parameters = config.getInitParameterNames();
        while (parameters.hasMoreElements()) {
            String element = parameters.nextElement();
            System.out.println(element + " = " + config.getInitParameter(element));
        }

    }

}

能夠看到,filter是在容器啓動的時候就初始化的。utf-8

五、Filter應用舉例

5.一、設置字符編碼集

@WebFilter(filterName = "PrivateFilter",urlPatterns = "/*")
public class PrivateFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("gbk");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

5.二、權限校驗

@WebFilter(filterName = "PrivateFilter",urlPatterns = "/*")
public class PrivateFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        String username = (String) req.getParameter("username");
        if (!"張三".equals(username)) {
            resp.getWriter().println("--------權限不足,沒法訪問---------");
            return;
        }
        chain.doFilter(req, resp);

    }

    public void init(FilterConfig config) throws ServletException {

    }

}


相關文章
相關標籤/搜索