Spring Boot實踐——Filter實現


Filter介紹

Filter是Servlet規范規定的,不屬於spring框架,也是用於請求的攔截。但是它適合更粗粒度的攔截,在請求前后做一些編解碼處理、日志記錄等。

一個Filter包括:
1)、在servlet被調用之前截獲;
2)、在servlet被調用之前檢查servlet request;
3)、根據需要修改request頭和request數據;
4)、根據需要修改response頭和response數據;
5)、在servlet被調用之后截獲

實現方式

一、基於注解方式

1.編寫自己的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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;

/**
 * 自定義過濾器
 * @ClassName: CustomFilter 
 * @Description: 過濾器,顧名思義,能夠過濾一切請求(而攔截器只能過濾action請求),包括靜態資源的請求。
 *                 chain.doFilter(request, response)表示過濾通過,能夠往下執行。
 *                 所以過濾操作要寫在chain.doFilter(request, response) 前面,作一些條件判斷;
 *                 如果不符合條件,則不執行chain.doFilter(request, response);
 * @author OnlyMate
 * @Date 2018年8月28日 下午3:04:44  
 *
 */
@Order(1)//定義優先級
@WebFilter(filterName="CustomFilter",urlPatterns="/*")
public class CustomFilter implements Filter{
    private Logger logger = LoggerFactory.getLogger(CustomFilter.class);
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.info("CustomFilter ==> init method: init");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        logger.info("CustomFilter ==> doFilter method: before");
        chain.doFilter(request, response);//執行請求
        logger.info("CustomFilter ==> doFilter method: after");
    }

    @Override
    public void destroy() {
        logger.info("CustomFilter ==> destroy method: destroy");
    }

}

 

2.配置

在項目的啟動入口上加上@ServletComponentScan注解,開啟掃描所有的servlet組件

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
//使用 @EnableWebMvc 注解,需要以編程的方式指定視圖文件相關配置;
//@EnableWebMvc
//使用 @EnableAutoConfiguration 注解,會讀取 application.properties 或 application.yml 文件中的配置
@EnableAutoConfiguration
@ServletComponentScan//springboot啟動類掃描servlet組件(過濾器)
public class Application {
    public static ApplicationContext applicationContext;
    
    private static final Logger logger = LoggerFactory.getLogger(Application.class);

    public static void main(String[] args) {
        startApplication(args);
    }

    public static ApplicationContext startApplication(String[] args) {
        if (applicationContext == null) {
            logger.info(" >>> Springboot Application 開始啟動...");
            SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
            SpringApplication application = builder.application();
            Set<String> sources = new HashSet<>();
            sources.add("classpath:applicationContext.xml");
            application.setSources(sources);

            applicationContext = application.run(args);
            logger.info(" >>> Springboot Application 啟動完成!");
        }
        return applicationContext;
    }
    
    public static ApplicationContext getApplicationContext() {
        if (applicationContext == null) {
            logger.error(" >>> Error:Springboot Application ApplicationContext is Null.");
        }
        return applicationContext;
    }

}

二、基於Java配置

1.編寫自己的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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 自定義過濾器
 * @ClassName: CustomPlainFilter 
 * @Description: 過濾器,顧名思義,能夠過濾一切請求(而攔截器只能過濾action請求),包括靜態資源的請求。
 *                 chain.doFilter(request, response)表示過濾通過,能夠往下執行。
 *                 所以過濾操作要寫在chain.doFilter(request, response) 前面,作一些條件判斷;
 *                 如果不符合條件,則不執行chain.doFilter(request, response);
 * @author OnlyMate
 * @Date 2018年8月28日 下午3:04:44  
 *
 */
public class CustomPlainFilter implements Filter{
    private Logger logger = LoggerFactory.getLogger(CustomPlainFilter.class);
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.info("CustomPlainFilter ==> init method: init");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        logger.info("CustomPlainFilter ==> doFilter method: before");
        chain.doFilter(request, response);//執行請求
        logger.info("CustomPlainFilter ==> doFilter method: after");
    }

    @Override
    public void destroy() {
        logger.info("CustomPlainFilter ==> destroy method: destroy");
    }

}

2.配置

自定義一個配置類

這里的配置有兩種方式,第一種是通過動態代理去找"customPlainFilter"對應的實體bean,第二種方式是直接注入自定義的filter(CustomFilterConfigurer)

/**
 * 自定義一個配置類
 * @ClassName: CustomFilterConfigurer 
 * @Description: TODO
 * @author OnlyMate
 * @Date 2018年8月31日 下午3:25:51  
 *
 */
@Configuration
public class CustomFilterConfigurer {
    @Bean
    public FilterRegistrationBean<DelegatingFilterProxy> testFilterRegistration() {

        FilterRegistrationBean<DelegatingFilterProxy> registration = new FilterRegistrationBean<DelegatingFilterProxy>();
        //第一種方式,使用動態代理的方式
        registration.setFilter(new DelegatingFilterProxy("customPlainFilter"));
        //第二種方式,直接注入一個filter
//        registration.setFilter(new CustomPlainFilter());
//        registration.setName("customPlainFilter");
        registration.addUrlPatterns("/*");
        registration.addInitParameter("paramName", "paramValue");
        registration.setEnabled(true);
        registration.setDispatcherTypes(DispatcherType.REQUEST);
        registration.setOrder(1);
        return registration;
    }
    
    @Bean(name="customPlainFilter")
    public CustomPlainFilter createCustomPlainFilter() {
        return new CustomPlainFilter();
    }
}

效果圖

總結

Spring Boot實現一個過濾器與傳統的方式差別很大,有想了解的可以看之前轉載別人的一篇

Spring boot下添加filter

 


免責聲明!

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



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