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

Spring攔截器實現(xiàn)鑒權(quán)的示例代碼

 更新時間:2023年07月14日 16:35:47   作者:Zayn~  
本文主要介紹了Spring攔截器實現(xiàn)鑒權(quán)的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

什么是攔截器?

攔截器(Interceptor)類似于Servlet中的過濾器,主要用于攔截用戶請求并做出相應(yīng)的處理,例如攔截器可以進行權(quán)限驗證、記錄請求信息的日志、判斷用戶是否登錄等。攔截器允許自定義預(yù)處理(Pre-Processing),在其中可以選擇禁止對應(yīng)Handler 的執(zhí)行;也允許自定義后處理(Post-Precessing);?

怎樣實現(xiàn)Spring攔截器?

實現(xiàn)Spring攔截器很簡單,只需要實現(xiàn)HandlerInterceptor接口即可。HandlerInterceptor這個接口中有三個核心方法:

1.preHandle方法:在HandlerMapping確定Handler對象之后,但在HandlerAdapter調(diào)用handler之前執(zhí)行(就是在調(diào)用controller之前執(zhí)行該方法)。該方法返回一個布爾值,只有true的時候才繼續(xù)執(zhí)行對應(yīng)的handler,否則不再執(zhí)行對應(yīng)的handler了。

default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        return true;
    }

2.postHandle方法:在 HandlerAdapter 實際調(diào)用處理程序之后,但在 DispatcherServlet 呈現(xiàn)視圖之前調(diào)用(就是在響應(yīng)返回客戶端之前執(zhí)行)。

default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}

3.afterCompletion方法:請求處理完成后回調(diào),即渲染視圖后。將在處理程序執(zhí)行的任何結(jié)果上被調(diào)用,從而允許適當?shù)馁Y源清理。注意:只有當這個攔截器的 preHandle 方法成功完成并返回 true 時才會被調(diào)用!與 postHandle 方法一樣,該方法將以相反的順序在鏈中的每個攔截器上調(diào)用,因此第一個攔截器將是最后一個被調(diào)用的。

default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}
}

關(guān)于上述三個核心方法調(diào)用的順序,在此我們假設(shè)有是三個攔截器,Interceptor1 、Interceptor2、和Interceptor3。在定義三個攔截器的時候我們就是按照這個順序定義的,而攔截器的執(zhí)行順序就是按照之前定義的順序執(zhí)行。

Interceptor1的preHandle方法 -> Interceptor2的preHandle方法 -> Interceptor3的preHandle方法 -> controller ->Interceptor3 的postHandle方法 -> Interceptor2 的postHandle方法 -> Interceptor1 的postHandle方法 -> Interceptor3 的afterCompletion方法 -> Interceptor2 的afterCompletion方法 ->Interceptor1 的afterCompletion方法。如圖:

如何使用Spring攔截器鑒權(quán)?

通過上述對三個核心方法的解釋可知,如果我們想通過攔截器實現(xiàn)鑒權(quán),那么只需要實現(xiàn)接口后,在preHandle方法中做相應(yīng)的處理即可。如下:

public class SecurityInterceptor implements HandlerInterceptor {
    @Autowired
    private JddPmsHelper jddPmsHelper;
    @Value("${global.authTest}")
    private String authTest;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //測試環(huán)境不校驗權(quán)限,需預(yù)發(fā)驗證
        if ("true".equals(authTest)) {
            return true;
        }
        String uri = request.getRequestURI();
        if (uri.contains("static")) {
            return true;
        }
        String pin = ServletUtils.getCommonPin();
        if (StringUtils.isBlank(pin)) {
            throw new NoLoginException("未登陸");
        }
        if (uri.equals("/")) {
            return true;
        }
        boolean checkResult = jddPmsHelper.authCheckUrl(pin, uri);
        if (!checkResult) {
            throw new NoneSecurityException("您沒有權(quán)限訪問,請聯(lián)系管理員,對您的erp賬號進行配置");
        }
        return true;
    }
    @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 {
    }
}

在實現(xiàn)HandlerInterceptor接口之后,可以通過

1、攔截器注冊:實現(xiàn)WebMvcConfigurer的addInterceptors注冊。

/**
 * 攔截器注冊 WebConfig
 *
 */
@Configuration
@Slf4j
public class WebConfig implements WebMvcConfigurer {
    /**
     * 登錄/權(quán)限攔截器
     */
    @Resource
    private CombinedLoginInterceptor combinedLoginInterceptor;
    /**
     * 控制層切面處理
     * ControllerExceptionHandler
     */
    @Resource
    private ControllerExceptionResolver controllerExceptionResolver;
    /**
     *
     */
    private static final String MATCH_ALL = "/**";
    /**
     * 免驗證
     */
    private static final String APP_EXCLUDE = "/common/info";
    /**
     * 異常頁
     */
    private static final String ERROR_URL = "/error";
    /**
     * 無需權(quán)限驗證的URI集合
     */
    private static final String[] PC_WHITE_LIST = {APP_EXCLUDE, ERROR_URL};
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //PC端登錄攔截,必須添加
        registry.addInterceptor(combinedLoginInterceptor).addPathPatterns(MATCH_ALL).excludePathPatterns(PC_WHITE_LIST).order(1);
    }
    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        resolvers.add(controllerExceptionResolver);
    }
}

2、通過XML文件注冊

    <!-- 單點登錄攔截器配置-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.xxx.intercepter.SecurityInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

除了使用攔截器鑒權(quán),還可以有哪幾種方式?

1、傳統(tǒng)AOP方式:在Controller方法前添加切點,然后再對切點進行處理即可。

2、過濾器:其實現(xiàn)相對簡單,只需要實現(xiàn)Filter接口即可。

詳細實現(xiàn)可以參考這篇文章: SpringBoot 項目鑒權(quán)的 4 種方式

到此這篇關(guān)于Spring攔截器實現(xiàn)鑒權(quán)的示例代碼的文章就介紹到這了,更多相關(guān)Spring攔截器鑒權(quán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中不用第三個變量來互換兩個變量的值

    Java中不用第三個變量來互換兩個變量的值

    在程序運行期間,隨時可能產(chǎn)生一些臨時數(shù)據(jù),應(yīng)用程序會將這些數(shù)據(jù)保存在一些內(nèi)存單元中,每個內(nèi)存單元都用一個標識符來標識。這些內(nèi)存單元被稱為變量,定義的標識符就是變量名,內(nèi)存單元中存儲的數(shù)據(jù)就是變量的值
    2021-10-10
  • Java源碼解析CopyOnWriteArrayList的講解

    Java源碼解析CopyOnWriteArrayList的講解

    今天小編就為大家分享一篇關(guān)于Java源碼解析CopyOnWriteArrayList的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 淺析java volatitle 多線程問題

    淺析java volatitle 多線程問題

    Volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內(nèi)存中重讀該成員變量的值。而且,當成員變量發(fā)生變化時,強迫線程將變化值回寫到共享內(nèi)存
    2013-08-08
  • java和c/c++ 數(shù)據(jù)類型長度的比較

    java和c/c++ 數(shù)據(jù)類型長度的比較

    本篇文章主要是對java和c/c++ 數(shù)據(jù)類型長度的進行了詳細的比較。需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • Java service層獲取HttpServletRequest工具類的方法

    Java service層獲取HttpServletRequest工具類的方法

    今天小編就為大家分享一篇關(guān)于Java service層獲取HttpServletRequest工具類的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Spring調(diào)度框架EnableScheduling&Scheduled源碼解析

    Spring調(diào)度框架EnableScheduling&Scheduled源碼解析

    這篇文章主要介紹了Spring調(diào)度框架EnableScheduling&Scheduled源碼解析,@EnableScheduling&Scheduled定時調(diào)度框架,本著不僅知其然還要知其所以然的指導(dǎo)思想,下面對該調(diào)度框架進行源碼解析,以便更好的理解其執(zhí)行過程,需要的朋友可以參考下
    2024-01-01
  • SpringBoot中web模板渲染的實現(xiàn)

    SpringBoot中web模板渲染的實現(xiàn)

    本文主要介紹了SpringBoot中web模板渲染的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • jdk環(huán)境變量配置切換jdk版本及安裝jdk后環(huán)境變量不生效問題解決辦法

    jdk環(huán)境變量配置切換jdk版本及安裝jdk后環(huán)境變量不生效問題解決辦法

    這篇文章主要介紹了jdk環(huán)境變量配置切換jdk版本及安裝jdk后環(huán)境變量不生效問題解決辦法,包括配置JAVA_HOME、Path和CLASSPATH,以及如何驗證配置是否成功,文章還講解了如何切換JDK版本,并解決了安裝新JDK后環(huán)境變量配置不生效的問題,需要的朋友可以參考下
    2024-12-12
  • java如何讀取yaml配置文件

    java如何讀取yaml配置文件

    這篇文章主要介紹了java如何讀取yaml配置文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java執(zhí)行cmd命令兩種實現(xiàn)方法解析

    Java執(zhí)行cmd命令兩種實現(xiàn)方法解析

    這篇文章主要介紹了Java執(zhí)行cmd命令兩種實現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07

最新評論