天天看點

javaWeb過濾器——Filter一、定義二、建立Filter 三、配置Filter多個Filter的執行順序

一、定義

javaWeb過濾器——Filter一、定義二、建立Filter 三、配置Filter多個Filter的執行順序

應用場景

  自動登入

  統一設定編碼格式

  通路權限控制

  敏感字元過濾等

javaWeb過濾器——Filter一、定義二、建立Filter 三、配置Filter多個Filter的執行順序

二、建立Filter

 1、配置web.xml

<filter>
        <filter-name>first</filter-name>
        <filter-class>net.pp.Filter.FirstFilter</filter-class>
        <init-param>
            <param-name>param</param-name>
            <param-value>value</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>first</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
           

2、實作Filter接口

FirstFilter.java

package net.pp.Filter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class FirstFilter implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String filterName = filterConfig.getFilterName();
        String initParameter = filterConfig.getInitParameter("param");
        ServletContext servletContext = filterConfig.getServletContext();
        System.out.println(filterName+"--"+initParameter);

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("FirstFilter已經執行攔截!");
        //解除攔截
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}
           

3、在Servlet中測試

TestFilter

package net.pp.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "TestServlet" ,urlPatterns = "/testFilter")
public class TestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("test/html;charset=utf-8");
        response.getWriter().write("testFilter已經被通路了!");

    }
}
           

結果:

javaWeb過濾器——Filter一、定義二、建立Filter 三、配置Filter多個Filter的執行順序

 三、配置Filter

1)url-Pattern配置

        配置要攔截的資源

  1. 以指定資源比對。例如

    "/index.jsp"

  2. 以目錄比對。例如

    "/servlet/*"

  3. 以字尾名比對,例如

    "*.jsp"

  4. 通配符,攔截所有web資源。

    "/*"

<filter-mapping>
        <filter-name>first</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
           

 2)dispatcherTypes **

配置攔截的類型,可配置多個。

FORWARD,//轉發的
    INCLUDE,//包含在頁面的
    REQUEST,//請求的
    ASYNC,//異步的
    ERROR;//出錯的
           

  3)注解方式配置

javaWeb過濾器——Filter一、定義二、建立Filter 三、配置Filter多個Filter的執行順序
package filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;

@WebFilter(filterName = "CharsetFilter",
        urlPatterns = "/*",/*通配符(*)表示對所有的web資源進行攔截*/
        initParams = {
        @WebInitParam(name = "charset", value = "utf-8")/*這裡可以放一些初始化的參數*/
        })
public class CharsetFilter implements Filter {
    private String filterName;
    private String charset;

    public void destroy() {
        /*銷毀時調用*/
        System.out.println(filterName + "銷毀");
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        /*過濾方法 主要是對request和response進行一些處理,然後交給下一個過濾器或Servlet處理*/
	System.out.println(filterName + "doFilter()");
        req.setCharacterEncoding(charset);
        resp.setCharacterEncoding(charset);
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

        /*初始化方法  接收一個FilterConfig類型的參數 該參數是對Filter的一些配置*/

        filterName = config.getFilterName();
        charset = config.getInitParameter("charset");

        System.out.println("過濾器名稱:" + filterName);
        System.out.println("字元集編碼:" + charset);

    }

}
           

多個Filter的執行順序

在我們的請求到達Servle之間是可以經過多個Filter的,一般來說,建議Filter之間不要有關聯,各自處理各自的邏輯即可。

如果一定要確定執行順序,就要對配置進行修改了,執行順序如下

在web.xml中,filter執行順序跟<filter-mapping>的順序有關,先聲明的先執行

使用注解配置的話,filter的執行順序跟名稱的字母順序有關,例如AFilter會比BFilter先執行

如果既有在web.xml中聲明的Filter,也有通過注解配置的Filter,那麼會優先執行web.xml中配置的Filter

繼續閱讀