好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

详谈springboot过滤器和拦截器的实现及区别

前言

springmvc中有两种很普遍的aop实现:

1. 过滤器 (filter)

2. 拦截器 (interceptor)

本篇面对的是一些刚接触 springboot 的人群

所以主要讲解filter和interceptor的简单实现和它们之间到底有什么区别

(一些复杂的功能我会之后发出文章,请记得关注)

filter的简单实现

字面意思:过滤器就是过滤的作用,在web开发中过滤一些我们指定的url

那么它能帮我们过滤什么呢?

那功能可就多了:

比如过拦截掉我们不需要的接口请求

修改请求(request)和响应(response)内容

完成cors跨域请求等等

现在我们来实现一个简单的过滤器:

可以新建一个filter包,随着项目的扩大过滤器会越来越多

在这里我新建了一个testfilter类,实现filter接口

?

1

2

3

@component

@webfilter (urlpatterns = "/blogs" ,filtername = "blostest" )

public class testfilter implements filter{}

我们一步步来

1.@component就是把这个类注入到ioc容器中

2.@webfilter(urlpatterns = "/blogs",filtername = "blostest")说明这是一个web过滤器,它拦截的url为/blogs,过滤器名字为blogstest

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@override

   public void init(filterconfig filterconfig) throws servletexception {

 

   }

 

   @override

   public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception {

     httpservletrequest request= (httpservletrequest) servletrequest;

     httpservletresponse response = (httpservletresponse) servletresponse;

     system.out.printf( "过滤器实现" );

     filterchain.dofilter(request,response);

   }

 

   @override

   public void destroy() {

 

   }

初始化(init)和摧毁(destroy)方法一般不会用到,具体使用看下源码便知

dofilter()是过滤器的核心

注意:在实现接口方法之后,我们要转换request和response类型至httpservlet,否则接下去的操作可能会报错。

如果过滤通过,执行filterchain.dofilter(request,response);

说明这个url已经经过了我们的filter

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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

//过滤器

   @bean

   public filterregistrationbean filterregistrationbean(){

     filterregistrationbean filterregistrationbean = new filterregistrationbean();

     list<string> urlpatterns = new arraylist<string>();

 

     testfilter testfilter = new testfilter();  //new过滤器

     urlpatterns.add( "/blogs" );   //指定需要过滤的url

     filterregistrationbean.setfilter(testfilter);    //set

     filterregistrationbean.seturlpatterns(urlpatterns);   //set

 

     return filterregistrationbean;

   }

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

interceptor的简单实现

拦截器的实现比过滤器稍微复杂一点

我们同样可以新建一个interceptor包

在里面新建一个名为myinterceptor的类

?

1

public class myinterceptor implements handlerinterceptor {}

这个类实现了handleinterceptor接口

直接贴类代码,我会在代码中注释功能

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public class myinterceptor implements handlerinterceptor {

   //在请求处理之前进行调用(controller方法调用之前

   @override

   public boolean prehandle(httpservletrequest httpservletrequest, httpservletresponse httpservletresponse, object o) throws exception {

     system.out.printf( "prehandle被调用" );

     return true ;  //如果false,停止流程,api被拦截

   }

 

   //请求处理之后进行调用,但是在视图被渲染之前(controller方法调用之后)

   @override

   public void posthandle(httpservletrequest httpservletrequest, httpservletresponse httpservletresponse, object o, modelandview modelandview) throws exception {

     system.out.println( "posthandle被调用" );

   }

 

   //在整个请求结束之后被调用,也就是在dispatcherservlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)

   @override

   public void aftercompletion(httpservletrequest httpservletrequest, httpservletresponse httpservletresponse, object o, exception e) throws exception {

     system.out.println( "aftercompletion被调用" );

   }

}

它依次实现了三个方法

相比过滤器,拦截器还需要在springmvc中注入

所以我们打开启动类,写入以下代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public class warapplication {

 

   public static void main(string[] args) {

     springapplication.run(warapplication. class , args);

   }

 

   //mvc控制器

   //@configuration

   static class webmvcconfigurer extends webmvcconfigureradapter{

     //增加拦截器

     public void addinterceptors(interceptorregistry registry){

       registry.addinterceptor( new myinterceptor())  //指定拦截器类

           .addpathpatterns( "/handles" );    //指定该类拦截的url

     }

   }

}

这里我在/handles这个url中进行拦截

代码写完了,来看下结果

当进入指定url时,我们执行到了拦截器

接下来就可以根据需求去使用拦截器了

区别

过滤器和拦截器非常相似,但是它们有很大的区别

最简单明了的区别就是过滤器可以修改request,而拦截器不能

过滤器需要在servlet容器中实现,拦截器可以适用于javaee,javase等各种环境

拦截器可以调用ioc容器中的各种依赖,而过滤器不能

过滤器只能在请求的前后使用,而拦截器可以详细到每个方法

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

总的来说

过滤器就是筛选出你要的东西,比如requeset中你要的那部分

拦截器在做安全方面用的比较多,比如终止一些流程

以上这篇详谈springboot过滤器和拦截器的实现及区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/sinat_32023305/article/details/79926588

查看更多关于详谈springboot过滤器和拦截器的实现及区别的详细内容...

  阅读:49次