Filter(过滤器)和Interceptor(拦截器)的区别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_26597927/article/details/81030420

springmvc中有两种很普遍的AOP实现:
1.过滤器(Filter)
2.拦截器(Interceptor)

本篇面对的是一些刚接触springboot的人群
所以主要讲解filter和interceptor的简单实现和它们之间到底有什么区别
(一些复杂的功能我会之后发出文章,请记得关注)

Filter的简单实现

字面意思:过滤器就是过滤的作用,在web开发中过滤一些我们指定的url
那么它能帮我们过滤什么呢?
那功能可就多了:
比如过拦截掉我们不需要的接口请求
修改请求(request)和响应(response)内容
完成CORS跨域请求等等

现在我们来实现一个简单的过滤器:
可以新建一个filter包,随着项目的扩大过滤器会越来越多
在这里我新建了一个TestFilter类,实现Filter接口


   
   
  1. @Component
  2. @WebFilter(urlPatterns = "/Blogs",filterName = "blosTest")
  3. public class TestFilter implements Filter{}

我们一步步来
1.@Component就是把这个类注入到IOC容器中
2.@WebFilter(urlPatterns = "/Blogs",filterName = "blosTest")说明这是一个web过滤器,它拦截的url为/Blogs,过滤器名字为blogsTest

下面贴出实现接口之后的三个重构方法:


   
   
  1. @Override
  2. public void init(FilterConfig filterConfig) throws ServletException {
  3. }
  4. @Override
  5. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  6. HttpServletRequest request= (HttpServletRequest) servletRequest;
  7. HttpServletResponse response = (HttpServletResponse) servletResponse;
  8. System.out.printf( "过滤器实现");
  9. filterChain.doFilter(request,response);
  10. }
  11. @Override
  12. public void destroy() {
  13. }

初始化(init)和摧毁(destroy)方法一般不会用到,具体使用看下源码便知
doFilter()是过滤器的核心
注意:在实现接口方法之后,我们要转换request和response类型至HttpServlet,否则接下去的操作可能会报错。
如果过滤通过,执行filterChain.doFilter(request,response);
说明这个url已经经过了我们的Filter
其他不要设置,我们执行看下结果:

clipboard.png

clipboard.png

可以看到,只需要一个类我们就实现了一个简单的过滤器

当然可以不用注解的方式,配置启动类


   
   
  1. //过滤器
  2. @Bean
  3. public FilterRegistrationBean filterRegistrationBean(){
  4. FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
  5. List< String> urlPatterns = new ArrayList< String>();
  6. TestFilter testFilter = new TestFilter(); //new过滤器
  7. urlPatterns.add( "/Blogs"); //指定需要过滤的url
  8. filterRegistrationBean.setFilter(testFilter); //set
  9. filterRegistrationBean.setUrlPatterns(urlPatterns); //set
  10. return filterRegistrationBean;
  11. }

这也是可以的,本人其实还是比较推荐这种方式添加过滤器

Interceptor的简单实现

拦截器的实现比过滤器稍微复杂一点
我们同样可以新建一个interceptor包
在里面新建一个名为MyInterceptor的类

public class MyInterceptor implements HandlerInterceptor {}

   
   

这个类实现了HandleInterceptor接口
直接贴类代码,我会在代码中注释功能


   
   
  1. public class MyInterceptor implements HandlerInterceptor {
  2. //在请求处理之前进行调用(Controller方法调用之前
  3. @Override
  4. public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
  5. System.out.printf("preHandle被调用");
  6. return true; //如果false,停止流程,api被拦截
  7. }
  8. //请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
  9. @Override
  10. public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
  11. System.out.println("postHandle被调用");
  12. }
  13. //在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
  14. @Override
  15. public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
  16. System.out.println("afterCompletion被调用");
  17. }
  18. }

它依次实现了三个方法
相比过滤器,拦截器还需要在springmvc中注入
所以我们打开启动类,写入以下代码


   
   
  1. public class WarApplication {
  2. public static void main( String [] args) {
  3. SpringApplication.run( WarApplication. class, args);
  4. }
  5. //mvc控制器
  6. //@Configuration
  7. static class WebMvcConfigurer extends WebMvcConfigurerAdapter{
  8. //增加拦截器
  9. public void addInterceptors( InterceptorRegistry registry){
  10. registry.addInterceptor( new MyInterceptor()) //指定拦截器类
  11. .addPathPatterns( "/Handles"); //指定该类拦截的url
  12. }
  13. }
  14. }

这里我在/Handles这个url中进行拦截
代码写完了,来看下结果

clipboard.png

clipboard.png

当进入指定url时,我们执行到了拦截器
接下来就可以根据需求去使用拦截器了

区别

过滤器和拦截器非常相似,但是它们有很大的区别
最简单明了的区别就是过滤器可以修改request,而拦截器不能
过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境
拦截器可以调用IOC容器中的各种依赖,而过滤器不能
过滤器只能在请求的前后使用,而拦截器可以详细到每个方法

区别很多,大家可以去查下

总的来说
过滤器就是筛选出你要的东西,比如requeset中你要的那部分
拦截器在做安全方面用的比较多,比如终止一些流程
网上有一张图片很不错,这里拷过来给大家看一下

clipboard.png

以上便是springboot中过滤器和拦截器的实现和区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值