自定義 @CurrentUser 獲取當前登入使用者
阿新 • • 發佈:2020-12-30
技術標籤:Java
1、使用到的兩個列舉
ElementType列舉:
- TYPE //介面、類、列舉
- .FIELD//欄位、列舉的常量
- METHOD//方法
- PARAMETER//方法引數
- CONSTRUCTOR //建構函式
- LOCAL_VARIABLE//區域性變數
- ANNOTATION_TYPE//註解
- PACKAGE///包
RetentionPolicy列舉:
- SOURCE //註解在原始碼是有效,將被編譯器丟棄
- CLASS //註解在編譯時有效,但在執行時沒有保留。這也是預設行為
- RUNTIME//執行時有效,並且可以通過反射獲取
2、實現自定義註解自動獲取當前登入使用者資訊
定義自定義註解
@Target(ElementType.PARAMETER) // 可用在方法的引數上 @Retention(RetentionPolicy.RUNTIME) // 執行時有效 public @interface CurrentUser { }
引數解析器
public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { boolean supportsParameter = parameter.getParameterType().isAssignableFrom(UserDetail.class) && parameter.hasParameterAnnotation(CurrentUser.class); return supportsParameter; } @Override public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if(authentication == null){ return null; } Object principal = authentication.getPrincipal(); if(!(principal instanceof UserDetail)){ return null; } UserDetail user = (UserDetail) principal; return user; } }
配置引數解析器
@Configuration public class WebConfig extends WebMvcConfigurerAdapter{ @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { argumentResolvers.add(currentUserMethodArgumentResolver()); super.addArgumentResolvers(argumentResolvers); } @Bean public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver(){ return new CurrentUserMethodArgumentResolver(); } }
使用
@RequestMapping(value = "/userInfo", method = RequestMethod.GET)
public Response<?> userInfo(@CurrentUser UserDetail userDetail) {
log.debug("userDetail={}",userDetail);
日誌