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

SpringBoot通過(guò)參數(shù)注解自動(dòng)獲取當(dāng)前用戶信息的方法

 更新時(shí)間:2024年03月12日 09:46:28   作者:寫程序的小熊貓  
這篇文章主要介紹了SpringBoot通過(guò)參數(shù)注解自動(dòng)獲取當(dāng)前用戶信息的方法,文中使用HandlerMethodArgumentResolver 類來(lái)實(shí)現(xiàn)這個(gè)功能,并通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下

需求:通過(guò)注解實(shí)現(xiàn)自動(dòng)獲取當(dāng)前用戶信息

思路:使用HandlerMethodArgumentResolver 類來(lái)實(shí)現(xiàn)這個(gè)功能;

這個(gè)接口有兩個(gè)方法,supportsParameter和resolveArgument。

  1. 方法supportsParameter返回值是boolean類型,它的作用是判斷Controller層中的參數(shù),是否滿足條件,滿足條件則執(zhí)行resolveArgument方法,不滿足則跳過(guò)。
  2. resolveArgument方法,它只有在supportsParameter方法返回true的情況下才會(huì)被調(diào)用。用于處理一些業(yè)務(wù),將返回值賦值給Controller層中的這個(gè)參數(shù)。

執(zhí)行流程

1.請(qǐng)求 ->
2.攔截器(獲取當(dāng)前用戶并放在UserContext中)->
3.Controller->參數(shù)解析器(檢測(cè)到參數(shù)中有設(shè)置的注解和參數(shù),則給參數(shù)賦值) ->
4.service中進(jìn)行使用當(dāng)前用戶信息

Controller

package com.haier.strategy.resolution.controller;

@Slf4j
@RestController
@RequestMapping("/api/v1/test")
@Tag(name = "測(cè)試")
public class TestController {

    @Autowired
    private TestService testService;



    /**
     * 測(cè)試
     *
     * @param name
     * @return
     */
    @Operation(summary = "測(cè)試,根據(jù)姓名獲取學(xué)生信息")
    @GetMapping("/getByName")
    public StudentVo getByName(@RequestParam("name") String name, @Parameter(hidden = true) @LoginUser UserBo userBo) {
        return testService.getByName(name, userBo);
    }

controller通過(guò)在參數(shù)中注明 @LoginUser UserBo userBo就可以實(shí)現(xiàn)在service中獲取當(dāng)前用戶信息

注解

/**
 * 標(biāo)記需要解析為用戶信息的參數(shù)
 *
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoginUser {
    boolean required() default true;

}

用戶實(shí)體類

/**
 * @Description: 用戶實(shí)體類
 * @Version: V1.0
 */
@Schema(description = "用戶實(shí)體類")
@Data
public class UserBo {

    @Schema(description = "用戶姓名")
    private String userName;
    @Schema(description = "用戶工號(hào)")
    private String jobNo;

}

userContext


/**
 * 用戶上下文UTIL
 *
 */
public class UserContext {

    /**
     * User holder
     * 考慮 TransmittableThreadLocal
     */
    private static final TransmittableThreadLocal<UserBo> CURRENT_USER_HOLDER = new TransmittableThreadLocal<>();
    private static final TransmittableThreadLocal<String> CURRENT_AUTHORIZATION = new TransmittableThreadLocal<>();

    /**
     * 保存 session
     *
     */
    public static void saveUser(UserBo user) {
        CURRENT_USER_HOLDER.set(user);
    }

    /**
     * 保存authorization
     */
    public static void saveAuthorization(String authorization) {
        CURRENT_AUTHORIZATION.set(authorization);
    }

    /**
     * 獲取authorization
     */
    public static String getAuthorization() {
        return CURRENT_AUTHORIZATION.get();
    }

    /**
     * 刪除authorization
     */
    public static void removeAuthorization() {
        CURRENT_AUTHORIZATION.remove();
    }

    /**
     * 當(dāng)前用戶
     *
     */
    public static UserBo currentUser() {
        return CURRENT_USER_HOLDER.get();
    }

    /**
     * remove session
     *
     */
    public static void removeUser() {
        CURRENT_USER_HOLDER.remove();
    }
}

攔截器

@Slf4j
@Component
public class UserLoginInterceptor implements HandlerInterceptor {

    @Autowired
    @Lazy
    private StrategyCommonClient strategyCommonClient;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String token = request.getHeader(CommonConst.ACCESS_TOKEN);
        String authorization = request.getHeader(CommonConst.AUTHORIZATION);
        UserContext.saveAuthorization(authorization);
        String userCode = request.getHeader(CommonConst.USER_CODE);
        ResultBody<UserBo> userRes;
        try {
            //通過(guò)認(rèn)證服務(wù)獲取當(dāng)前用戶信息
            userRes = commonClient.getUserInfo(userCode, token);
        } catch (Exception e) {
            throw new Exception("get_user_info_fail");
        }
        if (userRes.getCode() != 200 || userRes.getData() == null) {
            throw new Exception("get_user_info_fail");
        }
        UserContext.saveUser(userRes.getData());
        return true;
    }


    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //do nothing
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        UserContext.removeUser();
        UserContext.removeAuthorization();
    }
}


參數(shù)解析器

@Slf4j
@Component
public class LoginUserResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(LoginUser.class) && parameter.getParameterType().isAssignableFrom(UserBo.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        return UserContext.currentUser();
    }
}

到此這篇關(guān)于SpringBoot通過(guò)參數(shù)注解自動(dòng)獲取當(dāng)前用戶信息功能的文章就介紹到這了,更多相關(guān)SpringBoot參數(shù)注解獲取信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 三分鐘帶你了解SpringBoot真正的啟動(dòng)引導(dǎo)類

    三分鐘帶你了解SpringBoot真正的啟動(dòng)引導(dǎo)類

    這篇文章主要介紹了三分鐘帶你了解SpringBoot真正的啟動(dòng)引導(dǎo)類,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Mybatis?plugin的使用及原理示例解析

    Mybatis?plugin的使用及原理示例解析

    這篇文章主要為大家介紹了?Mybatis?plugin的使用及原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 詳解Java設(shè)計(jì)模式編程中的Flyweight享元模式的開發(fā)結(jié)構(gòu)

    詳解Java設(shè)計(jì)模式編程中的Flyweight享元模式的開發(fā)結(jié)構(gòu)

    這篇文章主要介紹了Java設(shè)計(jì)模式編程中的Flyweight享元模式的開發(fā)結(jié)構(gòu),享元模式能夠最大限度地重用現(xiàn)有的同類對(duì)象,需要的朋友可以參考下
    2016-04-04
  • Springboot實(shí)現(xiàn)郵箱驗(yàn)證代碼實(shí)例

    Springboot實(shí)現(xiàn)郵箱驗(yàn)證代碼實(shí)例

    這篇文章主要介紹了Springboot實(shí)現(xiàn)郵箱驗(yàn)證代碼實(shí)例,在一些業(yè)務(wù)需求中我們經(jīng)常需要使用郵箱進(jìn)行驗(yàn)證碼的收取,本文通過(guò)簡(jiǎn)單的代碼實(shí)例來(lái)說(shuō)明,需要的朋友可以參考下
    2024-01-01
  • java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字

    java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字

    本文主要介紹了java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 深入學(xué)習(xí)Java同步機(jī)制中的底層實(shí)現(xiàn)

    深入學(xué)習(xí)Java同步機(jī)制中的底層實(shí)現(xiàn)

    在多線程編程中我們會(huì)遇到很多需要使用線程同步機(jī)制去解決的并發(fā)問(wèn)題,這些同步機(jī)制是如何實(shí)現(xiàn)的呢?下面和小編來(lái)一起學(xué)習(xí)吧
    2019-05-05
  • 淺析Java如何高效將PDF轉(zhuǎn)換為高質(zhì)量TIFF圖片

    淺析Java如何高效將PDF轉(zhuǎn)換為高質(zhì)量TIFF圖片

    在文檔處理和歸檔系統(tǒng)中,將PDF文件轉(zhuǎn)換為TIFF格式是一項(xiàng)非常常見的需求,本文將介紹如何使用Java通過(guò)Spire.PDF?for?Java庫(kù),快速實(shí)現(xiàn)PDF到TIFF的轉(zhuǎn)換,希望對(duì)大家有所幫助
    2026-04-04
  • Spring Retry重試框架的使用講解

    Spring Retry重試框架的使用講解

    重試的使用場(chǎng)景比較多,比如調(diào)用遠(yuǎn)程服務(wù)時(shí),由于網(wǎng)絡(luò)或者服務(wù)端響應(yīng)慢導(dǎo)致調(diào)用超時(shí),此時(shí)可以多重試幾次。用定時(shí)任務(wù)也可以實(shí)現(xiàn)重試的效果,但比較麻煩,用Spring Retry的話一個(gè)注解搞定所有,感興趣的可以了解一下
    2023-01-01
  • Java 深入淺出掌握Map集合之雙列集合

    Java 深入淺出掌握Map集合之雙列集合

    雙列集合是每個(gè)元素都有鍵與值兩部分組成的集合,記錄的是鍵值對(duì)對(duì)應(yīng)關(guān)系,即通過(guò)鍵可以找到值,鍵必須是唯一,值可以重復(fù),接下來(lái)跟著小編具體了解吧
    2021-11-11
  • java自定義類加載器代碼示例

    java自定義類加載器代碼示例

    這篇文章主要介紹了java自定義類加載器代碼示例,具有一定借鑒價(jià)值,需要的朋友可以了解下。
    2017-12-12

最新評(píng)論

洛宁县| 河源市| 陆川县| 河间市| 渑池县| 灌南县| 桦川县| 辽中县| 丰县| 化隆| 邳州市| 江口县| 独山县| 循化| 泾阳县| 额济纳旗| 富锦市| 桂阳县| 土默特左旗| 石柱| 三江| 虞城县| 龙江县| 昔阳县| 天气| 竹北市| 郴州市| 瑞金市| 旬邑县| 湘潭市| 靖边县| 烟台市| 靖远县| 香河县| 自贡市| 牟定县| 鄂尔多斯市| 静乐县| 定结县| 赞皇县| 呼图壁县|