1、SpringBoot启动默认加载的Filter
- characterEncodingFilter
- hiddenHttpMethodFilter
- httpPutFormContentFilter
- requestContextFilter
2、Filter执行顺序
Ordered.HIGHEST_PRECEDENCE
Ordered.LOWEST_PRECEDENCE
低位值意味着更高的优先级 Higher values are interpreted as lower priority
自定义Filter,避免和默认的Filter优先级一样,不然会冲突
3、自定义filter实现
方法一:
第一步:启动类里面增加 @ServletComponentScan,进行扫描
第二步:新建一个MyFilter类实现Filter接口,重写方法,方法上加注解@WebFilter
@WebFilter(filterName = "myFilter2",urlPatterns = "/api/v2/*")
@Order(Ordered.LOWEST_PRECEDENCE -10)
public class MyFilter2 implements Filter {
/**
* filter启动执行,只执行一次
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyFilter2 ----------> init");
}
/**
* filter拦截执行,每次拦截都会执行
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("MyFilter2 ----------> doFilter");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
/**
* filter关闭执行,只执行一次
*/
@Override
public void destroy() {
System.out.println("MyFilter2 ----------> destroy");
}
}
场景:权限控制、用户登录(非前端后端分离场景)等
方法二:
第一步:创建一个类MyFilter实现FIlter接口,重写方法
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyFilter1 ----------> init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("MyFilter1 ----------> doFilter");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
System.out.println("MyFilter1 ----------> destroy");
}
}
第二步:在启动主类引入编写的Filter
@SpringBootApplication
@ServletComponentScan
public class FilterApplication {
public static void main(String[] args) {
SpringApplication.run(FilterApplication.class, args);
}
@Bean
public FilterRegistrationBean myFilterRegistration(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new MyFilter());
//定义拦截路径
filterRegistrationBean.addUrlPatterns("/api/v1/*");
//初始化参数
filterRegistrationBean.addInitParameter("paramName", "paramValue");
//定义拦截器名
filterRegistrationBean.setName("MyFilter2");
//定义拦截顺序,值越小越先执行
filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return filterRegistrationBean;
}
}
方法一是基于Servlet3.0的注解进行配置,使用起来更简单;方法二是注入Bean的方式实现拦截器的功能,将传统的xml配置拦截器的方式转为方法的实现
传统的Filter加载方式
filter的组成部分
- filter配置类
- 拦截的路径
- 初始化参数
- 忽略的路径
filter的配置
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.dtdx.filter.demo1.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
<init-param>
<param-name>paramName</param-name>
<param-value>paramValue</param-value>
</init-param>
</filter-mapping>