1. 程式人生 > 其它 >自定義 @CurrentUser 獲取當前登入使用者

自定義 @CurrentUser 獲取當前登入使用者

技術標籤: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);

日誌