Spring Boot实践——Filter实现

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

猜你喜欢

转载自blog.csdn.net/f45056231p/article/details/88899128
今日推荐