理解javax.servlet.Filter過濾器 ---- JavaWeb三大組件(Servlet、Filter、Listener)

JavaWEB三大組件加載順序:listener -> filter -> servlet   (當讀取web.xml文件的加載順序)

javax.servlet.Filter 是一個接口,過濾請求,實現請求的攔截或者放行,並且添加新的功能。

從上面的順序,知道  Filter 比 Servlet 先執行 ,那麼Filter 就可以攔截請求了,也就是說,所有請求進來,都先在他這裏走一遍,然後再到servlet的service中去

public class DemoFilter implements Filter {

    protected final Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.warn("DemoFilter狀態:[{}]", "過濾器初始化");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        logger.warn("DemoFilter狀態:[{}]", "執行過濾任務中");
        // 放行,執行下一個過濾器
        chain.doFilter(req, resp);
        logger.warn("DemoFilter狀態:[{}]", "過濾執行完畢");
    }

    @Override
    public void destroy() {
        logger.warn("DemoFilter狀態:[{}]", "過濾器銷燬");
    }
}

過濾器匹配URL規則:

精確匹配 —— 如/foo.htm,只會匹配foo.htm這個URL
路徑匹配 —— 如/foo/*,會匹配以foo爲前綴的URL
後綴匹配 —— 如*.htm,會匹配所有以.htm爲後綴的URL
其他寫法,如/foo/ ,/.htm ,/foo 都是不對的

在使用Filter的時候,光上面的 實現Filter是不夠的。必須在web.xml文件中配置Filter , 還可以自定義Filter的執行順序等。 

下面我貼一段,SpringBoot使用Filter的代碼:、

配置Filter:

package com.toad.config.filter;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

import javax.servlet.Filter;

/**
 * @author: wangqinmin
 * @date: 2019/4/22 16:16
 * @description: 仰天大笑出門去,我輩豈是蓬蒿人
 */
@Configuration
public class FilterConfig {

    @Bean
    public Filter demoFilter() {
        return new DemoFilter();
    }

    @Bean
    public Filter testFilter() {
        return new TestFilter();
    }

    /**
     * @return
     */
    @Bean
    @Order(value = 1) // 過濾器執行順序
    public FilterRegistrationBean demoFilterBean() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(demoFilter());
        // 設置過濾的url
        registration.addUrlPatterns("/*");
        return registration;
    }

    @Bean
    @Order(2)
    public FilterRegistrationBean testFilterBean() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(testFilter());
        registration.addUrlPatterns(
                "/index.html",
                "/api/applications/views/*",
                "/api/applications-details/views/details.html",
                "/api/applications-logfile/views/logfile.html",
                "/api/applications-metrics/views/metrics.html",
                "/api/applications-environment/views/environment.html",
                "/api/applications-logging/views/logging.html",
                "/api/applications-jmx/views/jmx.html",
                "/api/applications-threads/views/threads.html",
                "/api/applications-auditevents/auditevents.html",
                "/api/applications-trace/views/trace.html",
                "/api/applications/*/logfile",
                "/api/applications/*/env");
        return registration;
    }
}

自定義Filter (我這裏沒有做什麼過濾,都是直接放行了):

package com.toad.config.filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author: wangqinmin
 * @date: 2019/4/22 15:31
 * @description: 仰天大笑出門去,我輩豈是蓬蒿人
 */
public class DemoFilter implements Filter {

    protected final Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.warn("DemoFilter狀態:[{}]", "過濾器初始化");
    }

    /**
     * 暫時沒有做任何過濾
     *
     * @param request
     * @param response
     * @param chain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        logger.warn("DemoFilter狀態:[{}]", "執行過濾任務中");
        // 放行,執行下一個過濾器
        chain.doFilter(req, resp);
        logger.warn("DemoFilter狀態:[{}]", "過濾執行完畢");
    }

    @Override
    public void destroy() {
        logger.warn("DemoFilter狀態:[{}]", "過濾器銷燬");
    }
}
package com.toad.config.filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author: wangqinmin
 * @date: 2019/4/22 16:14
 * @description: 仰天大笑出門去,我輩豈是蓬蒿人
 */
public class TestFilter implements Filter {
    protected final Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.warn("TestFilter狀態:[{}]", "過濾器初始化");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        logger.warn("TestFilter狀態:[{}]", "執行過濾任務中");
        // 放行,執行下一個過濾器
        chain.doFilter(req, resp);
        logger.warn("TestFilter狀態:[{}]", "過濾執行完畢");
    }

    @Override
    public void destroy() {
        logger.warn("TestFilter狀態:[{}]", "過濾器銷燬");
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章