前言
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