一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳談springboot過濾器和攔截器的實現及區別

詳談springboot過濾器和攔截器的實現及區別

2021-05-26 13:11tom和cat Java教程

今天小編就為大家分享一篇詳談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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四虎在线视频免费观看 | 久久精品无码人妻无码AV蜜臀 | 成人久久18网站 | 日韩视频一区二区三区 | 精品91自产拍在线观看99re | 亚洲国产精品无码中文字满 | 爽爽窝窝午夜精品一区二区 | 国产亚洲欧美成人久久片 | 欧美精品色精品一区二区三区 | 女仆掀起蕾丝裙被打屁股作文 | 亚洲黄色高清 | 日韩视频在线精品视频免费观看 | 色综合网亚洲精品久久 | 国产91成人精品亚洲精品 | 五月天精品视频播放在线观看 | 天堂在线观看中文字幕 | 热99精品视频 | 日本国产成人精品视频 | 97色吧| 国产亚洲99影院 | 操mm| 成人精品视频一区二区在线 | 免费国产在线视频 | 亚洲日本在线观看网址 | 高h短篇合集 | 超兴奋朋友的中文字幕下 | 91网站入口| 国产精品免费小视频 | 天使萌痴汉在线中文字幕 | 精品免费国产 | 草β好视频| 四虎2023 | 亚洲国产日韩成人综合天堂 | 免费视频| 嗯啊在线观看免费影院 | 日本人在线看片 | 1024国产看片在线观看 | 50度灰破解版v5.7.0 | 俄罗斯精品bbw | avove本人照片 | 超碰av|