过滤器(Filter)是Servlet中常用的技术,可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,
常用的场景有登录校验、权限控制、敏感词过滤等,下面介绍下Spring Boot配置过滤器的方式
过滤器执行流程:
客户端发起请求的时候,首先是经过了Filter过滤器,处理了request请求,然后去执行了我们的servlet/jsp,当执行完毕后,我们的response响应也经过了过滤器,这里经过过滤器的时候是从放行后面开始执行的,也就是处理了response响应。
过滤器的应用:字符编码转换,敏感词过滤、登陆权限验证、资源访问权限等;
拦截器与过滤器使用场景:(场景类似)
spring Web MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。
1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);
4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
过滤器和拦截器执行顺序
先执行过滤器,之后拦截器
一.创建自定义过滤器实现Filter接口
@Component
public class MyFilter implements Filter {
//日志
private Logger logger= LoggerFactory.getLogger(getClass());
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyFilter.init");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
logger.info("过滤器---------start---------------");
/* if(request.getParameter("name").equals("张三")){
//放行
filterChain.doFilter(request,response); //如果==张三,下面这段是放行的意思----反之不放行
}*/
//走这个方法代表放行
filterChain.doFilter(request,response);
logger.info("过滤器---------end---------------");
}
@Override
public void destroy() {
System.out.println("MyFilter.destroy");
}
}
//走这个方法代表放行 filterChain.doFilter(request,response);
二.注册过虑器
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean timeFilter() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
MyFilter myFilter = new MyFilter();
registrationBean.setFilter(myFilter);
ArrayList<String> urls = new ArrayList<>();
urls.add("/*");//配置过滤规则------------url-pattern 中配置了/*之后,可以对所有要访问的资源拦截
registrationBean.setUrlPatterns(urls);
return registrationBean;
}
}
拦截器和过滤器区别
(1)拦截器是基于java的反射机制的,而过滤器是基于函数回调。
(2)拦截器不依赖于servlet容器,而过滤器依赖于servlet容器。
(3)拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
(4)拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
(5)在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
两者的本质区别:从灵活性上说拦截器功能更强大些,Filter能做的事情,他都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。