1.简介
Filter是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词、压缩响应信息等一些高级功能。它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
2.功能
处理全站中文乱码问题
实现自动登录
过滤敏感词汇
压缩网页
选择性让浏览器缓存
3.filter 链
在web.xml中,我们知道,执行顺序是谁在前边执行谁。在spring boot中的FilterRegistrationBean注册过滤器的类中有个order属性。
这个order的默认值是Integer.MAX_VALUE 也就是int的最大值,spring boot 会按照order值的大小,从小到大的顺序来依次过滤。
4.spring boot配置filter
1)FilterRegistrationBean的方式
1、创建两个实现Filter接口的类filter1 、filter2
package com.lixin.study.filter;
import javax.servlet.*;
import java.io.IOException;
public class filter1 implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("第一个过滤器创建");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("第一个过滤器执行");
}
@Override
public void destroy() {
System.out.println("第一个过滤器销毁");
}
}
package com.lixin.study.filter;
import javax.servlet.*;
import java.io.IOException;
public class filter2 implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("第二个过滤器创建");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("第二个过滤器执行");
}
@Override
public void destroy() {
System.out.println("第二个过滤器销毁");
}
}
2、创建配置类
有多个filter就创建多个FilterRegistrationBean ,若需注明filter的执行顺序,可通过registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE - 1)配置,值越大,执行顺序越靠后
package com.lixin.study.config;
import com.lixin.study.filter.filter1;
import com.lixin.study.filter.filter2;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean companyUrlFilterRegister() {
FilterRegistrationBean registration = new FilterRegistrationBean();
//注入过滤器
registration.setFilter(new filter1());
//拦截规则
registration.addUrlPatterns("/*");
//过滤器名称
registration.setName("filter1");
//过滤器顺序
registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE);
return registration;
}
@Bean
public FilterRegistrationBean outLinkSecurityFilterRegister() {
FilterRegistrationBean registration = new FilterRegistrationBean();
//注入过滤器
registration.setFilter(new filter2());
//拦截规则
registration.addUrlPatterns("/*");
//过滤器名称
registration.setName("filter2");
//过滤器顺序
registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE - 1);
return registration;
}
}
2)注解@WebFilter
1、在启动类上增加@ServletComponentScan注解,自动扫描带有过滤器注解的包
2、在类上使用@WebFilter和@Order组合实现
package com.lixin.study.filter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.core.annotation.Order;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName="filter3",urlPatterns= {"/*"})
@Order(FilterRegistrationBean.LOWEST_PRECEDENCE)
public class filter3 implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("第三个过滤器创建");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("第三个过滤器执行");
}
@Override
public void destroy() {
System.out.println("第三个过滤器销毁");
}
}