亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

SpringBoot快速設置攔截器并實現權限驗證的方法

2024-07-13 10:16:34
字體:
來源:轉載
供稿:網友

一、概述

攔截器的使用場景越來越多,尤其是面向切片編程流行之后。那通常攔截器可以做什么呢?

之前我們在Agent介紹中,提到過統計函數的調用耗時。這個思路其實和AOP的環繞增強如出一轍。

那一般來說,場景如下:

  1. 函數增強:比如對一個函數進行參數檢查,或者結果過濾等。甚至可以對函數就行權限認證。
  2. 性能監控:統計函數性能。
  3. 日志打點:比如在用戶登錄函數之前,打點統計PV等信息。

以及其他等等。

二、Spring的攔截器

無論是SpringMVC或者SpringBoot中,關于攔截器不得不提:
org.springframework.web.servlet.handler.HandlerInterceptorAdapter

public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {  // 在目標方法執行前執行  @Override  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {    return true;  }  // 在目標方法執行后執行,但在請求返回前,我們仍然可以對 ModelAndView進行修改  @Override  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)              throws Exception {}  // 在請求已經返回之后執行  @Override  public void afterCompletion(      HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)      throws Exception {}  // 用來處理異步請求, 當Controller中有異步請求方法的時候會觸發該方法  @Override  public void afterConcurrentHandlingStarted(      HttpServletRequest request, HttpServletResponse response, Object handler)      throws Exception {}}

三、實現一個用于驗證簡單權限的攔截器

1、自定義一個權限注解 @Auth

@Inherited@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Auth {  String user() default "";}
  1. @Inherited:在使用此自定義注解時,如果注解在類上面時,子類會自動繼承此注解,否則,子類不會繼承此注解。這里一定要記住,使用Inherited聲明出來的注解,只有在類上使用時才會有效,對方法,屬性等其他無效。
  2. @Target:表示此注解可以放置的位置。常見的位置有:TYPE=枚舉或注解上,FIELD=字段上,METHOD=方法上,PARAMETER=函數形參列表中,CONSTRUCTOR=構造函數上,LOCAL_VARIABLE=局部變量上 等等其他位置。
  3. @Retention:此注解的生命周期。常見的有:SOURCE=源碼時期;CLASS=字節碼時期(已編譯);RUNTIME=運行時期,通常是用這個的時候要多。
  4. @Documentd:生成注解文檔。

2、在Controller的方法上添加注解

上一步添加完注解后,之后要在你所使用的方法上添加相關注解,如下。

@RestController@EnableAutoConfigurationpublic class DemoController {  @Auth(user = "admin")  @RequestMapping(value = "/hello", method = RequestMethod.GET)  public String sayHello() {    return "hello world.";  }}

3、實現攔截器功能

需求:我們在用戶通過/hello這個URI訪問時,對其進行驗證,如果為admin則放行,否則拒絕,假設用戶的身份在URL參數中。

思路:因此我們要在執行sayHello()之前,對用戶做出驗證。如果其身份與注解中的身份相同,則放行。因此我們要在preHandle()中做文章。

難點:我們怎么拿到Controller 方法上的@Auth這個注解呢?看PreHandle()的三個參數,貌似也沒有哪個可以提供Controller類中的注解。

其實,第三個參數handler,一般情況下其類型為:org.springframework.web.method.HandlerMethod類型,而這里面含有注解的相關信息。

為什么這么說呢?

在SpringBoot中,注解的默認類型為函數級,而在SpringMVC其默認類型為Controller對象級別。

因此,如果在SpringMVC中需要在dispatcher-servlet.xml中配置:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>,這樣其類型才為HandlerMethod。

我們看下具體實現邏輯:

  @Override  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {    System.out.println("preHandle");    if (!handler.getClass().isAssignableFrom(HandlerMethod.class)) {      System.out.println("cat cast handler to HandlerMethod.class");      return true;    }    // 獲取注解    Auth auth = ((HandlerMethod) handler).getMethod().getAnnotation(Auth.class);    if (auth == null) {      System.out.println("cant find @Auth in this uri:" + request.getRequestURI());      return true;    }    // 從參數中取出用戶身份并驗證    String admin = auth.user();    if (!admin.equals(request.getParameter("user"))) {      System.out.println("permission denied");      response.setStatus(403);      return false;    }    return true;  }

其實實現邏輯就兩點:從參數中取出身份,和注解中的進行比對。

4、配置攔截器

那怎么讓剛才的這個攔截器生效呢?

這個時候,需要我們配置:WebMvcConfigurerAdapter

具體實現如下:

@Configurationpublic class ConfigAdapter extends WebMvcConfigurerAdapter {  @Override  public void addInterceptors(InterceptorRegistry registry) {    registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/hello");  }}

注意:這里有兩點需要注意,一個是@Configuration這個注解,這樣才能讓SpringBoot服務發現這個配置;另一個是配置匹配項,這里是對"/hello"這個進行攔截。("/**"是對所有的訪問攔截)

四、運行

訪問 http://127.0.0.1:8080/hello?user=admin就可以看到結果啦。

本文中的代碼詳見:https://github.com/hawkingfoo/springboot-interceptor

 以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品大片wwwwww| 成人激情视频在线| 国产一区二区黑人欧美xxxx| 国产欧美日韩最新| 一区二区三区 在线观看视| 精品久久久久久中文字幕大豆网| 日韩中文字幕网站| 日韩在线一区二区三区免费视频| 日韩网站免费观看| 亚洲成人激情视频| 亚洲精品美女网站| 欧美一级淫片videoshd| 俺去了亚洲欧美日韩| 亚洲无亚洲人成网站77777| 欧洲永久精品大片ww免费漫画| 尤物yw午夜国产精品视频明星| 日本电影亚洲天堂| 成人乱人伦精品视频在线观看| 亚洲综合中文字幕在线观看| 中文字幕免费精品一区| 欧美高清videos高潮hd| 亚洲精品视频中文字幕| 中文字幕av一区二区| 精品久久久91| 亚洲一区二区在线播放| 97高清免费视频| 亚洲人成电影网站色| 国产成人高清激情视频在线观看| 国产日韩在线精品av| 777国产偷窥盗摄精品视频| 亚洲男人7777| 国产精品大片wwwwww| 岛国av在线不卡| 91伊人影院在线播放| 久久av在线看| 精品国产一区二区三区久久| 91久久在线播放| 亚洲第一网站免费视频| 亚洲精品国产美女| 美女久久久久久久久久久| 日韩欧美在线观看视频| 国产欧美日韩免费| 日韩中文字幕在线免费观看| 91精品国产一区| 九九热最新视频//这里只有精品| 超在线视频97| 92看片淫黄大片欧美看国产片| 国产日韩综合一区二区性色av| 欧美国产日韩一区| 欧美插天视频在线播放| 欧美色图在线视频| www.日韩免费| 日韩成人激情视频| 久久久久国产精品免费| 国产精品久久久久久久久久东京| 九九热精品视频| 欧美精品久久久久久久久久| 亚洲精品ady| 久久久久久国产精品| 九色精品美女在线| 久久久这里只有精品视频| 国产成人精品免高潮费视频| 欧美丰满少妇xxxxx做受| 亚洲欧美激情视频| 庆余年2免费日韩剧观看大牛| 国产精品色视频| 欧美一级大片在线观看| 亚洲色图色老头| 亚洲欧美日韩在线一区| 日本在线精品视频| 欧美日韩国产精品一区二区不卡中文| 欧美性猛交xxxx| 成人www视频在线观看| 国产在线观看一区二区三区| 性色av一区二区三区红粉影视| 91在线视频导航| 欧美激情视频网| 亚洲最大av网| 国产亚洲精品久久久| 色综合伊人色综合网| 91网在线免费观看| 国内精品久久久久影院 日本资源| 萌白酱国产一区二区| 韩国国内大量揄拍精品视频| 中文国产成人精品| 久久视频国产精品免费视频在线| 精品久久在线播放| 久久久久久国产精品美女| 日韩欧美高清在线视频| 亚洲电影免费观看高清完整版在线观看| www.日韩免费| 欧美怡红院视频一区二区三区| 精品久久久久久中文字幕大豆网| 欧美日韩久久久久| 国产91免费观看| 91精品国产综合久久久久久蜜臀| 97不卡在线视频| 欧美激情久久久久久| 97在线视频一区| 亚洲免费成人av电影| 国产精品亚洲自拍| 国产日韩专区在线| 黄色成人av在线| 亚洲综合在线做性| 国产成人在线一区| 一区二区三区天堂av| 日韩高清a**址| 久久久精品在线| 欧美小视频在线观看| 久久久久亚洲精品| 亚洲欧美日韩一区二区三区在线| 欧美视频在线免费| 亚洲一区亚洲二区亚洲三区| 亚洲国模精品私拍| 亚洲高清久久久久久| 91午夜理伦私人影院| 38少妇精品导航| 精品高清一区二区三区| 青草热久免费精品视频| 亚洲成色999久久网站| 国产亚洲精品久久久| 欧美激情亚洲自拍| 26uuu另类亚洲欧美日本一| 成人高h视频在线| 国产日产久久高清欧美一区| 中文日韩电影网站| 亚洲美女中文字幕| 亚洲成人av在线| 黄色精品一区二区| 亚洲欧洲在线视频| 91日韩在线播放| xxav国产精品美女主播| 伊人成人开心激情综合网| 国产日韩欧美影视| 国产精品第七十二页| 国产欧美久久久久久| 38少妇精品导航| 91精品视频在线播放| 久久久精品美女| 国产精品爱久久久久久久| 国产精品视频在线播放| 国产美女91呻吟求| 欧美电影在线观看完整版| 欧美激情精品久久久久久免费印度| 日韩激情视频在线播放| 久久香蕉频线观| 日韩免费在线看| 欧美高跟鞋交xxxxxhd| 欧美成人精品影院| 中文字幕日韩综合av| 亚洲成人av中文字幕| 国产日韩精品电影| 国产精品福利小视频| 亚洲国产日韩精品在线| 国产精品爽爽爽爽爽爽在线观看| 亚洲高清免费观看高清完整版| 亚洲美女精品成人在线视频| 欧美成人精品三级在线观看| 国内外成人免费激情在线视频网站| 亚洲第一视频在线观看| 欧美日韩成人精品| 亚洲理论电影网| 久久久久女教师免费一区| 国产成人在线播放|