亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot項目鑒權的4種方式小結(jié)

 更新時間:2021年12月30日 11:06:45   作者:枕邊書  
本文主要介紹了SpringBoot項目鑒權的4種方式小結(jié),包括傳統(tǒng)AOP、攔截器、參數(shù)解析器和過濾器,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

文章介紹了spring-boot中實現(xiàn)通用auth的四種方式,包括 傳統(tǒng)AOP、攔截器、參數(shù)解析器和過濾器,并提供了對應的實例代碼,最后簡單總結(jié)了下他們的執(zhí)行順序。

前言

最近一直被無盡的業(yè)務需求淹沒,沒時間喘息,終于接到一個能讓我突破代碼舒適區(qū)的活兒,解決它的過程非常曲折,一度讓我懷疑人生,不過收獲也很大,代碼方面不明顯,但感覺自己抹掉了 java、Tomcat、Spring 一直擋在我眼前的一層紗。對它們的理解上了一個新的層次。 好久沒輸出了,于是挑一個方面總結(jié)一下,希望在梳理過程中再了解一些其他的東西。
由于 Java 繁榮的生態(tài),下面每一個模塊都有大量的文章專門講述。所以我選了另外一個角度,從實際問題出發(fā),將這些分散的知識串聯(lián)起來,各位可以作為一個綜述來看。各個模塊的極致詳細介紹,大家可以去翻官方文檔或看網(wǎng)絡上的其他博客。 需求很簡單清晰,跟產(chǎn)品們提的妖艷需求一點也不一樣:在我們的 web 框架里添加一個 通用的 appkey 白名單校驗功能,希望它的擴展性更好一些。

這個 web 框架是部門前驅(qū)者基于 spring-boot 實現(xiàn)的,介于業(yè)務和 Spring 框架之間,做一些偏向于業(yè)務的通用性功能,如 日志輸出、功能開關、通用參數(shù)解析等。平常是對業(yè)務透明的,最近一直忙于把需求做好,代碼寫好,甚至從沒注意過它的存在。

傳統(tǒng)AOP

對于這種需求,首先想到的當然是 Spring-boot 提供的 AOP 接口,只需要在 Controller 方法前添加切點,然后再對切點進行處理即可。

實現(xiàn)

其使用步驟如下:

  1. 使用? @Aspect?聲明一下切面類? WhitelistAspect;
  2. 在切面類內(nèi)添加一個切點? whitelistPointcut(),為了實現(xiàn)此切點靈活可裝配的能力,這里不使用? execution?全部攔截,而是添加一個注解? @Whitelist,被注解的方法才會校驗白名單。
  3. 在切面類中使用 spring 的 AOP 注解? @Before?聲明一個通知方法? checkWhitelist()?在 Controller 方法被執(zhí)行之前校驗白名單。

切面類偽代碼如下:

@Aspect
public class WhitelistAspect {
   
 @Before(value = "whitelistPointcut() && @annotation(whitelist)")
 public void checkAppkeyWhitelist(JoinPoint joinPoint, Whitelist whitelist) {
     checkWhitelist();
     // 可使用 joinPoint.getArgs() 獲取Controller方法的參數(shù)
     // 可以使用 whitelist 變量獲取注解參數(shù)
 }
   
   
 @Pointcut("@annotation(com.zhenbianshu.Whitelist)")
 public void whitelistPointCut() {
 }
}

在Controller方法上添加? @Whitelist?注解實現(xiàn)功能。

擴展

本例中使用了 注解 來聲明切點,并且我實現(xiàn)了通過注解參數(shù)來聲明要校驗的白名單,如果之后還需要添加其他白名單的話,如通過 UID 來校驗,則可以為此注解添加? uid()?等方法,實現(xiàn)自定義校驗。 此外,spring 的 AOP 還支持? execution(執(zhí)行方法) 、bean(匹配特定名稱的 Bean 對象的執(zhí)行方法)等切點聲明方法和? @Around(在目標函數(shù)執(zhí)行中執(zhí)行) 、@After(方法執(zhí)行后)?等通知方法。 如此,功能已經(jīng)實現(xiàn)了,但領導并不滿意=_=,原因是項目中 AOP 用得太多了,都用濫了,建議我換一種方式。嗯,只好搞起。

Interceptor

Spring 的 攔截器(Interceptor) 實現(xiàn)這個功能也非常合適。顧名思義,攔截器用于在 Controller 內(nèi) Action 被執(zhí)行前通過一些參數(shù)判斷是否要執(zhí)行此方法,要實現(xiàn)一個攔截器,可以實現(xiàn) Spring 的? HandlerInterceptor?接口。

實現(xiàn)

實現(xiàn)步驟如下:

  • 定義攔截器類? AppkeyInterceptor?類并實現(xiàn) HandlerInterceptor 接口。
  • 實現(xiàn)其? preHandle()?方法;
  • 在 preHandle 方法內(nèi)通過注解和參數(shù)判斷是否需要攔截請求,攔截請求時接口返回? false;
  • 在自定義的? WebMvcConfigurerAdapter?類內(nèi)注冊此攔截器;

AppkeyInterceptor?類如下:

@Component
public class WhitelistInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Whitelist whitelist = ((HandlerMethod) handler).getMethodAnnotation(Whitelist.class);
        // whitelist.values(); 通過 request 獲取請求參數(shù),通過 whitelist 變量獲取注解參數(shù)
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  // 方法在Controller方法執(zhí)行結(jié)束后執(zhí)行
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  // 在view視圖渲染完成后執(zhí)行
    }
}

擴展

要啟用 攔截器還要顯式配置它啟用,這里我們使用? WebMvcConfigurerAdapter?對它進行配置。需要注意,繼承它的的? MvcConfiguration?需要在 ComponentScan 路徑下。

@Configuration
public class MvcConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new WhitelistInterceptor()).addPathPatterns("/*").order(1);
        // 這里可以配置攔截器啟用的 path 的順序,在有多個攔截器存在時,任一攔截器返回 false 都會使后續(xù)的請求方法不再執(zhí)行
    }
}

還需要注意,攔截器執(zhí)行成功后響應碼為? 200,但響應數(shù)據(jù)為空。 ?當使用攔截器實現(xiàn)功能后,領導終于祭出大招了:我們已經(jīng)有一個 Auth 參數(shù)了,appkey 可以從 Auth 參數(shù)里取到,可以把在不在白名單作為 Auth 的一種方式,為什么不在 Auth 時校驗?emmm… 吐血中。

ArgumentResolver

參數(shù)解析器是 Spring 提供的用于解析自定義參數(shù)的工具,我們常用的? @RequestParam?注解就有它的影子,使用它,我們可以將參數(shù)在進入Controller Action之前就組合成我們想要的樣子。 Spring 會維護一個? ResolverList, 在請求到達時,Spring 發(fā)現(xiàn)有自定義類型參數(shù)(非基本類型), 會依次嘗試這些 Resolver,直到有一個 Resolver 能解析需要的參數(shù)。要實現(xiàn)一個參數(shù)解析器,需要實現(xiàn)? HandlerMethodArgumentResolver?接口。

實現(xiàn)

  1. 定義自定義參數(shù)類型?AuthParam,類內(nèi)有 appkey 相關字段;
  2. 定義?AuthParamResolver?并實現(xiàn) HandlerMethodArgumentResolver 接口;
  3. 實現(xiàn)?supportsParameter()?接口方法將 AuthParam 與 AuthParamResolver 適配起來;
  4. 實現(xiàn)?resolveArgument()?接口方法解析 reqest 對象生成 AuthParam 對象,并在此校驗 AuthParam ,確認 appkey 是否在白名單內(nèi);
  5. 在 Controller Action 方法上簽名內(nèi)添加 AuthParam 參數(shù)以啟用此 Resolver;

實現(xiàn)的 AuthParamResolver 類如下:

@Component
public class AuthParamResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().equals(AuthParam.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        Whitelist whitelist = parameter.getMethodAnnotation(Whitelist.class);
        // 通過 webRequest 和 whitelist 校驗白名單
        return new AuthParam();
    }
}

擴展

當然,使用參數(shù)解析器也需要單獨配置,我們同樣在? WebMvcConfigurerAdapter內(nèi)配置:

@Configuration
public class MvcConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new AuthParamResolver());
    }
}

這次實現(xiàn)完了,我還有些不放心,于是在網(wǎng)上查找是否還有其他方式可以實現(xiàn)此功能,發(fā)現(xiàn)常見的還有? Filter。

Filter

Filter 并不是 Spring 提供的,它是在 Servlet 規(guī)范中定義的,是 Servlet 容器支持的。被 Filter 過濾的請求,不會派發(fā)到 Spring 容器中。它的實現(xiàn)也比較簡單,實現(xiàn)? javax.servlet.Filter接口即可。 由于不在 Spring 容器中,F(xiàn)ilter 獲取不到 Spring 容器的資源,只能使用原生 Java 的 ServletRequest 和 ServletResponse 來獲取請求參數(shù)。 另外,在一個 Filter 中要顯示調(diào)用 FilterChain 的 doFilter 方法,不然認為請求被攔截。實現(xiàn)類似:

public class WhitelistFilter implements javax.servlet.Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
  // 初始化后被調(diào)用一次
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
     // 判斷是否需要攔截
       chain.doFilter(request, response); // 請求通過要顯示調(diào)用
    }

    @Override
    public void destroy() {
     // 被銷毀時調(diào)用一次
    }
}

擴展

Filter 也需要顯示配置:

@Configuration
public class FilterConfiguration {

    @Bean
    public FilterRegistrationBean someFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new WhitelistFilter());
        registration.addUrlPatterns("/*");
        registration.setName("whitelistFilter");
        registration.setOrder(1); // 設置過濾器被調(diào)用的順序
        return registration;
    }
}

小結(jié)

四種實現(xiàn)方式都有其適合的場 景,那么它們之間的調(diào)用順序如何呢? Filter 是 Servlet 實現(xiàn)的,自然是最先被調(diào)用,后續(xù)被調(diào)用的是 Interceptor 被攔截了自然不需要后續(xù)再進行處理,然后是 參數(shù)解析器,最后才是切面的切點。

到此這篇關于SpringBoot項目鑒權的4種方式小結(jié)的文章就介紹到這了,更多相關SpringBoot項目鑒權內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Struts2學習筆記(1)-入門教程

    Struts2學習筆記(1)-入門教程

    本文是一個Struts2的簡單入門教程,比較簡單,希望能給大家做一個參考。
    2016-06-06
  • java基于jcifs.smb實現(xiàn)遠程發(fā)送文件到服務器

    java基于jcifs.smb實現(xiàn)遠程發(fā)送文件到服務器

    這篇文章主要介紹了java基于jcifs.smb實現(xiàn)遠程發(fā)送文件到服務器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java字符拼接成字符串的注意點詳解

    Java字符拼接成字符串的注意點詳解

    這篇文章主要介紹了Java字符拼接成字符串的注意點詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Spring-boot的debug調(diào)試代碼實例

    Spring-boot的debug調(diào)試代碼實例

    這篇文章主要介紹了Spring-boot的debug調(diào)試代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • 啟動 Eclipse 彈出 Failed to load the JNI shared library jvm.dll 錯誤的解決方法

    啟動 Eclipse 彈出 Failed to load the JNI shared library jvm.dll

    這篇文章主要介紹了有時候,新電腦上回碰到打開Eclipse時,彈出提示“Failed to load the JNI shared library jvm.dll”錯誤,這里給大家分享解決方案
    2016-08-08
  • SpringBoot+EasyPoi實現(xiàn)excel導出功能

    SpringBoot+EasyPoi實現(xiàn)excel導出功能

    最新小編遇到這樣一個需求,根據(jù)檢索條件查詢列表并將結(jié)果導出到excel,實現(xiàn)過程也非常簡單,感興趣的朋友跟隨小編一起看看吧
    2021-09-09
  • idea tomcat亂碼問題的解決及相關設置的步驟

    idea tomcat亂碼問題的解決及相關設置的步驟

    這篇文章主要介紹了idea tomcat亂碼問題的解決及相關設置的步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • Spring RestTemplate具體使用詳解

    Spring RestTemplate具體使用詳解

    這篇文章主要介紹了Spring RestTemplate具體使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • Java利用Easyexcel導出excel表格的示例代碼

    Java利用Easyexcel導出excel表格的示例代碼

    這篇文章主要為大家詳細介紹了Java利用Easyexcel導出excel表格的示例代碼,文中的代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-07-07
  • SpringMVC返回圖片的幾種方式(小結(jié))

    SpringMVC返回圖片的幾種方式(小結(jié))

    這篇文章主要介紹了SpringMVC返回圖片的幾種方式(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01

最新評論