最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳談springboot過濾器和攔截器的實現(xiàn)及區(qū)別

 更新時間:2018年08月19日 10:44:46   作者:tom和cat  
今天小編就為大家分享一篇詳談springboot過濾器和攔截器的實現(xiàn)及區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

前言

springmvc中有兩種很普遍的AOP實現(xiàn):

1.過濾器(Filter)

2.攔截器(Interceptor)

本篇面對的是一些剛接觸springboot的人群

所以主要講解filter和interceptor的簡單實現(xiàn)和它們之間到底有什么區(qū)別

(一些復雜的功能我會之后發(fā)出文章,請記得關注)

Filter的簡單實現(xiàn)

字面意思:過濾器就是過濾的作用,在web開發(fā)中過濾一些我們指定的url

那么它能幫我們過濾什么呢?

那功能可就多了:

比如過攔截掉我們不需要的接口請求

修改請求(request)和響應(response)內(nèi)容

完成CORS跨域請求等等

現(xiàn)在我們來實現(xiàn)一個簡單的過濾器:

可以新建一個filter包,隨著項目的擴大過濾器會越來越多

在這里我新建了一個TestFilter類,實現(xiàn)Filter接口

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

我們一步步來

1.@Component就是把這個類注入到IOC容器中

2.@WebFilter(urlPatterns = "/Blogs",filterName = "blosTest")說明這是一個web過濾器,它攔截的url為/Blogs,過濾器名字為blogsTest

下面貼出實現(xiàn)接口之后的三個重構方法:

@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("過濾器實現(xiàn)");
    filterChain.doFilter(request,response);
  }
 
  @Override
  public void destroy() {
 
  }

初始化(init)和摧毀(destroy)方法一般不會用到,具體使用看下源碼便知

doFilter()是過濾器的核心

注意:在實現(xiàn)接口方法之后,我們要轉換request和response類型至HttpServlet,否則接下去的操作可能會報錯。

如果過濾通過,執(zhí)行filterChain.doFilter(request,response);

說明這個url已經(jīng)經(jīng)過了我們的Filter

可以看到,只需要一個類我們就實現(xiàn)了一個簡單的過濾器

當然可以不用注解的方式,配置啟動類

//過濾器
  @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的簡單實現(xiàn)

攔截器的實現(xiàn)比過濾器稍微復雜一點

我們同樣可以新建一個interceptor包

在里面新建一個名為MyInterceptor的類

public class MyInterceptor implements HandlerInterceptor {}

這個類實現(xiàn)了HandleInterceptor接口

直接貼類代碼,我會在代碼中注釋功能

public class MyInterceptor implements HandlerInterceptor {
  //在請求處理之前進行調(diào)用(Controller方法調(diào)用之前
  @Override
  public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
    System.out.printf("preHandle被調(diào)用");
    return true;  //如果false,停止流程,api被攔截
  }
 
  //請求處理之后進行調(diào)用,但是在視圖被渲染之前(Controller方法調(diào)用之后)
  @Override
  public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    System.out.println("postHandle被調(diào)用");
  }
 
  //在整個請求結束之后被調(diào)用,也就是在DispatcherServlet 渲染了對應的視圖之后執(zhí)行(主要是用于進行資源清理工作)
  @Override
  public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    System.out.println("afterCompletion被調(diào)用");
  }
}

它依次實現(xiàn)了三個方法

相比過濾器,攔截器還需要在springmvc中注入

所以我們打開啟動類,寫入以下代碼

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時,我們執(zhí)行到了攔截器

接下來就可以根據(jù)需求去使用攔截器了

區(qū)別

過濾器和攔截器非常相似,但是它們有很大的區(qū)別

最簡單明了的區(qū)別就是過濾器可以修改request,而攔截器不能

過濾器需要在servlet容器中實現(xiàn),攔截器可以適用于javaEE,javaSE等各種環(huán)境

攔截器可以調(diào)用IOC容器中的各種依賴,而過濾器不能

過濾器只能在請求的前后使用,而攔截器可以詳細到每個方法

區(qū)別很多,大家可以去查下

總的來說

過濾器就是篩選出你要的東西,比如requeset中你要的那部分

攔截器在做安全方面用的比較多,比如終止一些流程

以上這篇詳談springboot過濾器和攔截器的實現(xiàn)及區(qū)別就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Mybatis傳遞多個參數(shù)的解決辦法(三種)

    Mybatis傳遞多個參數(shù)的解決辦法(三種)

    這篇文章主要介紹了Mybatis傳遞多個參數(shù)的解決辦法(三種),個人覺得第三種解決辦法比較好用,有需要的朋友一起學習吧
    2016-05-05
  • 用SpringBoot Admin監(jiān)控SpringBoot程序

    用SpringBoot Admin監(jiān)控SpringBoot程序

    這篇文章主要介紹了用SpringBoot Admin監(jiān)控SpringBoot程序,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-10-10
  • 關于mybatis3中幾個@Provider的使用方式

    關于mybatis3中幾個@Provider的使用方式

    這篇文章主要介紹了關于mybatis3中幾個@Provider的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java String不可變性實現(xiàn)原理解析

    Java String不可變性實現(xiàn)原理解析

    這篇文章主要介紹了Java String不可變性實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • SpringBoot實現(xiàn)配置文件加密的方案分享

    SpringBoot實現(xiàn)配置文件加密的方案分享

    項目的數(shù)據(jù)庫密碼、redis 密碼等明文展示在配置文件中會有潛在的風險,因此采用合適的安全防護措施是有必要的,下面小編就為大家介紹一下SpringBoot中配置文件加密的方法,希望對大家有所幫助
    2023-11-11
  • java高并發(fā)的volatile與Java內(nèi)存模型詳解

    java高并發(fā)的volatile與Java內(nèi)存模型詳解

    這篇文章主要介紹了java高并發(fā)的volatile與Java內(nèi)存模型,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-10-10
  • Java設計模式中裝飾者模式應用詳解

    Java設計模式中裝飾者模式應用詳解

    裝飾者模式:在不改變原有對象的基礎之上,動態(tài)的將功能附加到對象上,提供了繼承更有彈性的替代方案,也體現(xiàn)了開閉原則。本文將通過示例詳細講解一下裝飾者模式,需要的可以參考一下
    2022-11-11
  • 在idea2023中使用SpringBoot整合Lombok全過程及詳細用法

    在idea2023中使用SpringBoot整合Lombok全過程及詳細用法

    Lombok項目是一個java庫,它可以自動插入到編輯器和構建工具中,增強java的性能,本文詳細給大家介紹了在idea2023中使用SpringBoot整合Lombok全過程及詳細用法,需要的朋友可以參考下
    2023-09-09
  • 使用IntelliJ IDEA調(diào)式Stream流的方法步驟

    使用IntelliJ IDEA調(diào)式Stream流的方法步驟

    本文主要介紹了使用IntelliJ IDEA調(diào)式Stream流的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • mybatis查詢實現(xiàn)返回List<Map>類型數(shù)據(jù)操作

    mybatis查詢實現(xiàn)返回List<Map>類型數(shù)據(jù)操作

    這篇文章主要介紹了mybatis查詢實現(xiàn)返回List<Map>類型數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11

最新評論

昌图县| 嘉峪关市| 玛纳斯县| 城固县| 遂昌县| 砚山县| 金沙县| 光山县| 德安县| 南宫市| 平阳县| 凉城县| 黑龙江省| 孟村| 寿光市| 通许县| 德清县| 万载县| 曲周县| 德昌县| 济南市| 瓮安县| 嘉定区| 越西县| 福海县| 胶南市| 望江县| 湘阴县| 邵东县| 汶川县| 崇州市| 城口县| 清新县| 会东县| 邵武市| 宁乡县| 渑池县| 平顶山市| 田林县| 琼海市| 海宁市|