1. 程式人生 > >SpringBoot學習-(十一)SpringBoot過濾器

SpringBoot學習-(十一)SpringBoot過濾器

兩種加入spring ioc容器的方法

  1. 在過濾器上面新增@Component註解
  2. 在springboot啟動類上面新增@ServletComponentScan註解(Servlet、Filter、Listener 可以直接通過 @WebServlet、@WebFilter、@WebListener 註解自動註冊,無需其他程式碼)

1.目錄結構

這裡寫圖片描述

2.編寫過濾器

package com.ahut.filter;

import java.io.IOException;

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 javax.servlet.annotation.WebFilter; import org.springframework.stereotype.Component; /** * * @ClassName: MyFilter * @Description:自定義過濾器 * @author
cheng * @date 2017年9月26日 上午9:19:38 */
// 加入spring ioc容器 @Component /* * @WebFilter將一個實現了javax.servlet.Filter介面的類定義為過濾器 * 屬性filterName宣告過濾器的名稱,可選 * 屬性urlPatterns指定要過濾 的URL模式,也可使用屬性value來宣告.(指定要過濾的URL模式是必選屬性) */ @WebFilter(filterName = "myFilter", urlPatterns = "/*") public class MyFilter implements Filter
{
/** * 執行過濾操作 */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(request, response); System.out.println("執行過濾操作。。。"); } /** * 過濾器初始化 */ @Override public void init(FilterConfig config) throws ServletException { System.out.println("過濾器初始化。。。"); } /** * 過濾器銷燬 */ @Override public void destroy() { System.out.println("過濾器銷燬。。。"); } }

注意:過濾器在伺服器啟動時初始化,伺服器關閉時銷燬!!!

3.多個過濾器執行的順序問題

目錄結構:
這裡寫圖片描述

過濾器程式碼:

package com.ahut.filter;

import java.io.IOException;

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 javax.servlet.annotation.WebFilter;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 
 * @ClassName: MyFilter
 * @Description:自定義過濾器
 * @author cheng
 * @date 2017年9月26日 上午9:19:38
 */
// 加入spring ioc容器
@Component
/*
 * @WebFilter將一個實現了javax.servlet.Filter介面的類定義為過濾器 
 * 屬性filterName宣告過濾器的名稱,可選
 * 屬性urlPatterns指定要過濾 的URL模式,也可使用屬性value來宣告.(指定要過濾的URL模式是必選屬性)
 */
@WebFilter(filterName = "myFilter", urlPatterns = "/*")
//指定過濾器的執行順序,值越小越靠後執行
@Order(1)
public class MyFilter implements Filter {

    /**
     * 執行過濾操作
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        chain.doFilter(request, response);
        System.out.println("執行過濾操作。。。111");
    }

    /**
     * 過濾器初始化
     */
    @Override
    public void init(FilterConfig config) throws ServletException {
        System.out.println("過濾器初始化。。。111");
    }

    /**
     * 過濾器銷燬
     */
    @Override
    public void destroy() {
        System.out.println("過濾器銷燬。。。111");
    }

}
package com.ahut.filter;

import java.io.IOException;

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 javax.servlet.annotation.WebFilter;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 
 * @ClassName: MyFilter2
 * @Description:自定義過濾器
 * @author cheng
 * @date 2017年9月26日 上午9:19:38
 */
// 加入spring ioc容器
@Component
/*
 * @WebFilter將一個實現了javax.servlet.Filter介面的類定義為過濾器 
 * 屬性filterName宣告過濾器的名稱,可選
 * 屬性urlPatterns指定要過濾 的URL模式,也可使用屬性value來宣告.(指定要過濾的URL模式是必選屬性)
 */
@WebFilter(filterName = "myFilter2", urlPatterns = "/*")
//指定過濾器的執行順序,值越大越先執行
@Order(2)
public class MyFilter2 implements Filter {

    /**
     * 執行過濾操作
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        chain.doFilter(request, response);
        System.out.println("執行過濾操作。。。222");
    }

    /**
     * 過濾器初始化
     */
    @Override
    public void init(FilterConfig config) throws ServletException {
        System.out.println("過濾器初始化。。。222");
    }

    /**
     * 過濾器銷燬
     */
    @Override
    public void destroy() {
        System.out.println("過濾器銷燬。。。222");
    }

}

執行結果:

過濾器初始化。。。222
過濾器初始化。。。111

執行過濾操作。。。222
執行過濾操作。。。111

過濾器銷燬。。。222
過濾器銷燬。。。111

結論:
通過@Order(i)註解可以控制過濾器的執行順序
i的值越小,過濾器越靠後執行
i的值越大,過濾器越先執行

2018.9.4日新增

使用java配置方式註冊過濾器FilterRegistrationBean

過濾器

package com.ahut.essearch.filter;

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

import javax.servlet.*;
import java.io.IOException;

/**
 * desc : 關鍵詞處理過濾器
 * create_user : cheng
 * create_date : 2018/9/4 18:56
 */
public class KeywordHandleFilter implements Filter {

    /**
     * 日誌列印
     */
    private Logger log = LoggerFactory.getLogger(KeywordHandleFilter.class);

    /**
     * desc : 初始化
     * create_user : cheng
     * create_date : 2018/9/4 19:01
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("KeywordHandleFilter初始化");
    }

    /**
     * desc : 對關鍵詞進行處理
     * create_user : cheng
     * create_date : 2018/9/4 19:01
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("KeywordHandleFilter執行過濾操作");
        chain.doFilter(request, response);
    }

    /**
     * desc : 銷燬
     * create_user : cheng
     * create_date : 2018/9/4 19:01
     */
    @Override
    public void destroy() {
        log.info("KeywordHandleFilter銷毀");
    }
}

java配置

package com.ahut.essearch.config;

import com.ahut.common.constant.SystemConst;
import com.ahut.essearch.filter.KeywordHandleFilter;
import com.ahut.essearch.filter.KeywordValidateFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;

import java.util.ArrayList;
import java.util.List;

/**
 * desc : 過濾器配置
 * create_user : cheng
 * create_date : 2018/9/4 18:36
 */
@Configuration
public class FilterConfig {

    /**
     * 日誌列印
     */
    private Logger log = LoggerFactory.getLogger(FilterConfig.class);

    /**
     * desc : 註冊關鍵詞處理過濾器
     * create_user : cheng
     * create_date : 2018/9/4 19:04
     */
    @Bean
    public FilterRegistrationBean registerKeywordHandleFilter () {
        FilterRegistrationBean filterBean = new FilterRegistrationBean();

        KeywordHandleFilter keywordHandleFilter = new KeywordHandleFilter();

        // 設定過濾器名稱, 執行順序, 攔截url
        String filterName = keywordHandleFilter.getClass().getSimpleName();
        int order = 3;
        List<String> urlPatterns = new ArrayList<>(1);
        urlPatterns.add("/v1/query/keyword");

        filterBean.setFilter(keywordHandleFilter);
        filterBean.setName(filterName);
        filterBean.setOrder(order);
        filterBean.setUrlPatterns(urlPatterns);

        log.info(String.format("註冊過濾器, 過濾器name: %s, 過濾器order: %d, 過濾器過濾url: %s", filterName, order, urlPatterns));
        return filterBean;
    }

}

注意:registrationBean.setOrder(1)是設定該過濾器執行的順序。SpringBoot會根據order從小到大的順序執行。