目录
前言
今天进行随记二、过滤器和拦截器,在昨天的登录游戏时,突然想到了过滤器和拦截器,因为学习完了springboot已经过了很长的时间,所以竟然已经记不太清楚了,所以在今天闲下来的时间做一个总结,一下是个人见解,可供大家做一个基本的参考和理解
一、Filter过滤器是什么?
Filter过滤器是JavaWeb三大组件之一(Servlet、Filter、Listener)之一,其实通俗的理解Filter过滤器就是在javaWeb中,通过过滤器能操作你传入的request、response,进行一些业务上的操作,如常用的过滤掉非法的url、统一字符集等。
二、Filter过滤器有哪些应用场景?
(1)过滤敏感词汇
(2)统一字符编码
(3)敏感字符处理
(4)URL权限控制访问
三、Filter过滤器如何实现?
(1)定义一个类实现Filter接口,重写其所有方法
(2)配置Filter,Filter实现类加上@WebFilter注解,配置资源的拦截路径,启动类上加入@ServeletComponentScan注解开启Servlet支持
代码如下(示例):
//定义一个类DemoFilter实现Filter接口 @WebFilter(urlPatterns = "/*") public class DemoFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //初始化方法,web服务启动,创建Fliter时调用,只调用一次 Filter.super.init(filterConfig); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //拦截到请求时,调用方法,可调用多次 System.out.println("拦截方法执行拦截到请求"); filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { //销毁方法,服务器关闭时调用,只调用一次 Filter.super.destroy(); } }//如下是启动类FlyPigApplication加入注解支持Servlet
@ServletComponentScan @SpringBootApplication public class FlyPigApplication { public static void main(String[] args) { SpringApplication.run(FlyPigApplication.class, args); } }
四、urlPatterns过滤规则
拦截路径 | urlPatterns值 | 含义 |
拦截具体路径 | /login | 只有访问/login路径时,才会被拦截 |
目录拦截 | /terms/* | 访问/terms下所有路径时,都会被拦截 |
拦截所有 | /* | 访问所有的资源都会被拦截 |
五、Intercepter拦截器是什么?
Intercepter拦截器是一种动态拦截方法调用的机制,就是在你方法执行前调用一个Intercepter中的方法,或者方法后调用一个Intercepter的方法,如简单的实现:动态代理,或者则方法的前后执行其他的业务逻辑
六、Intercepter拦截器有哪些应用场景?
(1)登录校验:token的检验识别
(2)日志记录:记录请求信息的日志
(3)性能监控:请求的处理时间
七、Intercepter拦截器如何实现?
(1)定义一个类LoginCheckInterceptor来实现HandlerInterceptor,重写其方法,注意类上需要加入@component注解,将他的bean注入到springMVC容器中
(2)定义配置类WebConfig实现WebMvcConfigurer,注入LoginCheckInterceptor的对象,在WebConfig类中重写addinterceptors方法,配置拦截路径,注意WebConfig类需要注解@configuration注解标注配置类
代码如下(个人练习编写):
//第一步定义LoginCheckInterceptor类 @Component @Slf4j public class LoginCheckInterceptor implements HandlerInterceptor { @Override//目标资源方法前执行,true放行,false不放行 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("prehandle方法执行,业务逻辑生成完毕"); return true; } @Override//目标方法执行后执行 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("posthandle方法执行完毕"); } @Override//视图渲染完毕后执行,最后执行 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("视图渲染完毕"); } }//第二步定义WebConfig类 @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private LoginCheckInterceptor loginCheckInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**"); } }
四、addPathPatterns规则
拦截路径 | 含义 | 举例 |
/* | 一级路径 | 能匹配 /login、/emp等,不能匹配 /login/1 |
/** | 任意路径 | 能匹配 /dept、/dept/1、/dept/1/2等所有路径 |
/dept/* | /dept 下的一级路径 | 能匹配/dept/1,不能匹配/dept/1/2、/dept |
/dept/** | /dept下的任意路径 | 能匹配/dept/1、/dept/1/2,不能匹配其他资源路径和/dept |
八、最最最重要的小总结
相信大家都很聪明以上这些对于大家都很easy,同时大家也一定存在一个问题,就是会发现Filter过滤器和Intercpetor拦截器很是相似都是拦截,甚至上面的两个拦截规则都很是相似,所以就会混淆他们两个,在我学习完理解后过了一段时间之后也会这样再回想起来也会混淆,所以在我查询了多方的资料后总结了这两个的异同。
1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
2、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。
3、过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射
4、Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。
5、Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理(反射)的方式来执行。
6、Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。
7、过滤器(Filter) :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。
8、 拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。
以上小总结个人查阅借鉴,如有侵权联系博主
总结
过滤器和拦截器还是由很大的区别,在实际的开发和应用中大家可以根据情境来灵活选择