详谈springboot过滤器和拦截器的实现及区别
前言
springmvc中有两种很普遍的AOP实现:
1.过滤器(Filter)
2.拦截器(Interceptor)
本篇面对的是一些刚接触springboot的人群
所以主要讲解filter和interceptor的简单实现和它们之间到底有什么区别
(一些复杂的功能我会之后发出文章,请记得关注)
Filter的简单实现
字面意思:过滤器就是过滤的作用,在web开发中过滤一些我们指定的url
那么它能帮我们过滤什么呢?
那功能可就多了:
比如过拦截掉我们不需要的接口请求
修改请求(request)和响应(response)内容
完成CORS跨域请求等等
现在我们来实现一个简单的过滤器:
可以新建一个filter包,随着项目的扩大过滤器会越来越多
在这里我新建了一个TestFilter类,实现Filter接口
@Component @WebFilter(urlPatterns="/Blogs",filterName="blosTest") publicclassTestFilterimplementsFilter{}
我们一步步来
1.@Component就是把这个类注入到IOC容器中
2.@WebFilter(urlPatterns="/Blogs",filterName="blosTest")说明这是一个web过滤器,它拦截的url为/Blogs,过滤器名字为blogsTest
下面贴出实现接口之后的三个重构方法:
@Override publicvoidinit(FilterConfigfilterConfig)throwsServletException{ } @Override publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{ HttpServletRequestrequest=(HttpServletRequest)servletRequest; HttpServletResponseresponse=(HttpServletResponse)servletResponse; System.out.printf("过滤器实现"); filterChain.doFilter(request,response); } @Override publicvoiddestroy(){ }
初始化(init)和摧毁(destroy)方法一般不会用到,具体使用看下源码便知
doFilter()是过滤器的核心
注意:在实现接口方法之后,我们要转换request和response类型至HttpServlet,否则接下去的操作可能会报错。
如果过滤通过,执行filterChain.doFilter(request,response);
说明这个url已经经过了我们的Filter
可以看到,只需要一个类我们就实现了一个简单的过滤器
当然可以不用注解的方式,配置启动类
//过滤器 @Bean publicFilterRegistrationBeanfilterRegistrationBean(){ FilterRegistrationBeanfilterRegistrationBean=newFilterRegistrationBean(); ListurlPatterns=newArrayList (); TestFiltertestFilter=newTestFilter();//new过滤器 urlPatterns.add("/Blogs");//指定需要过滤的url filterRegistrationBean.setFilter(testFilter);//set filterRegistrationBean.setUrlPatterns(urlPatterns);//set returnfilterRegistrationBean; }
这也是可以的,本人其实还是比较推荐这种方式添加过滤器
Interceptor的简单实现
拦截器的实现比过滤器稍微复杂一点
我们同样可以新建一个interceptor包
在里面新建一个名为MyInterceptor的类
publicclassMyInterceptorimplementsHandlerInterceptor{}
这个类实现了HandleInterceptor接口
直接贴类代码,我会在代码中注释功能
publicclassMyInterceptorimplementsHandlerInterceptor{ //在请求处理之前进行调用(Controller方法调用之前 @Override publicbooleanpreHandle(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse,Objecto)throwsException{ System.out.printf("preHandle被调用"); returntrue;//如果false,停止流程,api被拦截 } //请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后) @Override publicvoidpostHandle(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse,Objecto,ModelAndViewmodelAndView)throwsException{ System.out.println("postHandle被调用"); } //在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要是用于进行资源清理工作) @Override publicvoidafterCompletion(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse,Objecto,Exceptione)throwsException{ System.out.println("afterCompletion被调用"); } }
它依次实现了三个方法
相比过滤器,拦截器还需要在springmvc中注入
所以我们打开启动类,写入以下代码
publicclassWarApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(WarApplication.class,args); } //mvc控制器 //@Configuration staticclassWebMvcConfigurerextendsWebMvcConfigurerAdapter{ //增加拦截器 publicvoidaddInterceptors(InterceptorRegistryregistry){ registry.addInterceptor(newMyInterceptor())//指定拦截器类 .addPathPatterns("/Handles");//指定该类拦截的url } } }
这里我在/Handles这个url中进行拦截
代码写完了,来看下结果
当进入指定url时,我们执行到了拦截器
接下来就可以根据需求去使用拦截器了
区别
过滤器和拦截器非常相似,但是它们有很大的区别
最简单明了的区别就是过滤器可以修改request,而拦截器不能
过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境
拦截器可以调用IOC容器中的各种依赖,而过滤器不能
过滤器只能在请求的前后使用,而拦截器可以详细到每个方法
区别很多,大家可以去查下
总的来说
过滤器就是筛选出你要的东西,比如requeset中你要的那部分
拦截器在做安全方面用的比较多,比如终止一些流程
以上这篇详谈springboot过滤器和拦截器的实现及区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。