国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

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

2024-07-14 08:42:04
字體:
供稿:網(wǎng)友

前言

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

1.過濾器(Filter)

2.攔截器(Interceptor)

本篇面對(duì)的是一些剛接觸springboot的人群

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

(一些復(fù)雜的功能我會(huì)之后發(fā)出文章,請(qǐng)記得關(guān)注)

Filter的簡單實(shí)現(xiàn)

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

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

那功能可就多了:

比如過攔截掉我們不需要的接口請(qǐng)求

修改請(qǐng)求(request)和響應(yīng)(response)內(nèi)容

完成CORS跨域請(qǐng)求等等

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

可以新建一個(gè)filter包,隨著項(xiàng)目的擴(kuò)大過濾器會(huì)越來越多

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

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

我們一步步來

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

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

下面貼出實(shí)現(xiàn)接口之后的三個(gè)重構(gòu)方法:

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

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

doFilter()是過濾器的核心

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

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

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

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

當(dāng)然可以不用注解的方式,配置啟動(dòng)類

//過濾器  @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;  }

這也是可以的,本人其實(shí)還是比較推薦這種方式添加過濾器

Interceptor的簡單實(shí)現(xiàn)

攔截器的實(shí)現(xiàn)比過濾器稍微復(fù)雜一點(diǎn)

我們同樣可以新建一個(gè)interceptor包

在里面新建一個(gè)名為MyInterceptor的類

public class MyInterceptor implements HandlerInterceptor {}

這個(gè)類實(shí)現(xiàn)了HandleInterceptor接口

直接貼類代碼,我會(huì)在代碼中注釋功能

public class MyInterceptor implements HandlerInterceptor {  //在請(qǐng)求處理之前進(jìn)行調(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被攔截  }   //請(qǐng)求處理之后進(jìn)行調(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)用");  }   //在整個(gè)請(qǐng)求結(jié)束之后被調(diào)用,也就是在DispatcherServlet 渲染了對(duì)應(yīng)的視圖之后執(zhí)行(主要是用于進(jìn)行資源清理工作)  @Override  public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {    System.out.println("afterCompletion被調(diào)用");  }}

它依次實(shí)現(xiàn)了三個(gè)方法

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

所以我們打開啟動(dòng)類,寫入以下代碼

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這個(gè)url中進(jìn)行攔截

代碼寫完了,來看下結(jié)果

當(dāng)進(jìn)入指定url時(shí),我們執(zhí)行到了攔截器

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

區(qū)別

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

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

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

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

過濾器只能在請(qǐng)求的前后使用,而攔截器可以詳細(xì)到每個(gè)方法

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

總的來說

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

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

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


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 文昌市| 锡林浩特市| 长丰县| 湖北省| 巴林左旗| 茌平县| 永嘉县| 枞阳县| 永清县| 民和| 鲁甸县| 铜川市| 泽库县| 临沂市| 勐海县| 霍州市| 济南市| 莱阳市| 平江县| 张掖市| 晋中市| 平凉市| 定陶县| 稷山县| 改则县| 探索| 平和县| 宝坻区| 光山县| 阿拉善盟| 铁岭市| 大埔县| 马公市| 临漳县| 调兵山市| 金秀| 沂南县| 定安县| 富民县| 舟山市| 永仁县|