SpringBoot通過(guò)參數(shù)注解自動(dòng)獲取當(dāng)前用戶(hù)信息的方法
需求:通過(guò)注解實(shí)現(xiàn)自動(dòng)獲取當(dāng)前用戶(hù)信息
思路:使用HandlerMethodArgumentResolver 類(lèi)來(lái)實(shí)現(xiàn)這個(gè)功能;
這個(gè)接口有兩個(gè)方法,supportsParameter和resolveArgument。
- 方法supportsParameter返回值是boolean類(lèi)型,它的作用是判斷Controller層中的參數(shù),是否滿足條件,滿足條件則執(zhí)行resolveArgument方法,不滿足則跳過(guò)。
- resolveArgument方法,它只有在supportsParameter方法返回true的情況下才會(huì)被調(diào)用。用于處理一些業(yè)務(wù),將返回值賦值給Controller層中的這個(gè)參數(shù)。
執(zhí)行流程
1.請(qǐng)求 ->
2.攔截器(獲取當(dāng)前用戶(hù)并放在UserContext中)->
3.Controller->參數(shù)解析器(檢測(cè)到參數(shù)中有設(shè)置的注解和參數(shù),則給參數(shù)賦值) ->
4.service中進(jìn)行使用當(dāng)前用戶(hù)信息
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)前用戶(hù)信息
注解
/**
* 標(biāo)記需要解析為用戶(hù)信息的參數(shù)
*
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoginUser {
boolean required() default true;
}
用戶(hù)實(shí)體類(lèi)
/**
* @Description: 用戶(hù)實(shí)體類(lèi)
* @Version: V1.0
*/
@Schema(description = "用戶(hù)實(shí)體類(lèi)")
@Data
public class UserBo {
@Schema(description = "用戶(hù)姓名")
private String userName;
@Schema(description = "用戶(hù)工號(hào)")
private String jobNo;
}
userContext
/**
* 用戶(hù)上下文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)前用戶(hù)
*
*/
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)前用戶(hù)信息
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)前用戶(hù)信息功能的文章就介紹到這了,更多相關(guān)SpringBoot參數(shù)注解獲取信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JFreeChart實(shí)現(xiàn)實(shí)時(shí)曲線圖
這篇文章主要為大家詳細(xì)介紹了JFreeChart實(shí)現(xiàn)實(shí)時(shí)曲線圖的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Java微信二次開(kāi)發(fā)(一) Java微信請(qǐng)求驗(yàn)證功能
這篇文章主要為大家詳細(xì)介紹了Java微信二次開(kāi)發(fā)第一篇,Java微信請(qǐng)求驗(yàn)證功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Java模擬rank/over函數(shù)實(shí)現(xiàn)獲取分組排名的方法詳解
這篇文章主要為大家詳細(xì)介紹了Java模擬rank()、over()函數(shù)獲取分組排名的方法設(shè)計(jì)及實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04
淺談緩沖字符流 BufferedReader BufferedWriter用法
這篇文章主要介紹了緩沖字符流 BufferedReader BufferedWriter的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
詳解SpringBoot整合RabbitMQ如何實(shí)現(xiàn)消息確認(rèn)
這篇文章主要介紹了SpringBoot整合RabbitMQ是如何實(shí)現(xiàn)消息確認(rèn)的,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
springboot3集成mybatis-plus報(bào)sqlSession異常的問(wèn)題解決
springboot3已經(jīng)發(fā)布正式版,但是在集成mybatis-plus最新版3.5.2的時(shí)候發(fā)現(xiàn)提示異常,本文就來(lái)介紹一下報(bào)sqlSession異常的問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
java正則表達(dá)式提取數(shù)字的方法實(shí)例
這篇文章主要介紹了java正則表達(dá)式提取數(shù)字的方法,還有去除字符串?dāng)?shù)字的方法,大家參考使用吧2013-12-12
SpringBoot整合OpenCV的實(shí)現(xiàn)示例
這篇文章主要介紹了SpringBoot整合OpenCV的實(shí)現(xiàn)示例。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

