两种加入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从小到大的顺序执行。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐