カスタムアノテーションLoginUserとHandlerMethodArgumentResolverを使用して、現在ログインしているユーザーを一律に取得します

1つ、コメントを追加します

/ 
 ***
 インターフェイスパラメータで現在ログインしているユーザーオブジェクトをバインドするために使用されるマークアノテーション* @ author yanghui 
 * @date 2020/12/17 
 ** / 
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType .PARAMETER})
@ Documented 
public @interface LoginUser { 

}

2.loginUserアノテーションのパーサーを作成します

/ ** 
 *カスタムパラメーターパーサー
 *関数:ログインしたユーザーオブジェクトを取得し、メソッドパラメーターにバインドします
 * @author yanghui 
 * @date 2020/12/17 
 ** / 
public class LoginUserHandlerMethodArgumentResolverimplements HandlerMethodArgumentResolver { 

    @Override 
    public boolean supportParameter (MethodParameter methodParameter){ 
        return methodParameter.hasParameterAnnotation(LoginUser.class); 
    } 

    @Override 
    public Object resolveArgument (MethodParameter methodParameter、ModelAndViewContainer modelAndViewContainer、NativeWebRequest nativeWebRequest、WebDataBinderFactory webDataBinderFactory)throws Exception { WebRequestget.N) 
        if(nativeWebRequest)instance of HttpServletRequest.getNativeRequest()
            HttpServletRequestリクエスト=(HttpServletRequest)nativeWebRequest.getNativeRequest(); 
            request.getAttribute( "LOGIN_USER");を返します。
        } 
        nullを返します。
    } 
}

 

3、カスタムインターセプター

パブリッククラスWebInterceptorはHandlerInterceptorを実装します{ 

    @Autowiredprivate 
    RedisUtil redisUtil; 

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

          //ログインしたユーザーに移動し、redisに移動してリクエストに入れます2番目にリクエストのユーザー情報を取得してアノテーションに入れ
        ます。Authenticationauthentication= SecurityContextHolder.getContext()。getAuthentication(); 
        SimpleUser simpleUser = new SimpleUser(); 
        if(authentication!= null && authentication.getDetails() != null){ 
            if(authentication.getDetails()instanceof OAuth2AuthenticationDetails){
                OAuth2AuthenticationDetails details =(OAuth2AuthenticationDetails)authentication.getDetails(); 
                オブジェクトobj = redisUtil.get(details.getTokenValue()); 
                if(obj!= null){ 
                    simpleUser = JSON.parseObject(obj.toString()、SimpleUser.class); 
                } else { 
                    String userName =(String)authentication.getPrincipal(); 
                    simpleUser.setUsername(userName); 
                } 
            } else if(UsernamePasswordAuthenticationTokenの認証インスタンス){ 
                simpleUser =(SimpleUser)authentication.getPrincipal(); 
            } else if(authentication.getPrincipal()!= null){
                simpleUser.setUsername(authentication.getPrincipal()。toString()); 
            } 
        } 
 
        / **ログインオブジェクトを渡し、カスタムパラメータパーサーで使用します* /
        request.setAttribute( "LOGIN_USER"、simpleUser); 

        trueを返します。
    }

第4に、構成クラスを作成し、カスタムインターセプターとパラメーターパーサーを追加します

@Configuration 
public class WebInterceptorConfigimplements WebMvcConfigurer { 

    / ** 
     *カスタムパラメータパーサー
     *関数:ログインしたユーザーオブジェクトを取得し、メソッドのパラメータにバインドします
     * @author yanghui 
     * @date 2019/12/17 
     * @return LoginUserHandlerMethodArgumentResolver 
     ** / 
    @Bean
    公共LoginUserHandlerMethodArgumentResolver getLoginUserHandlerMethodArgumentResolver(){
        戻り新しいLoginUserHandlerMethodArgumentResolver(); 
    } 

    / ** 
     *ログイン検証インターセプター
     * 
     * @return 
     * / 
    @Bean
    公共WebInterceptor loginRequiredInterceptor(){ 
    @Override 
        )(新しいWebInterceptorを返します。
    } 


    public void addInterceptors(InterceptorRegistry Registry){ 
        //ユーザー操作のアクセス許可を確認する必要があるリクエストを追加
        registry.addInterceptor(loginRequiredInterceptor())。
                addPathPatterns( "/ **"); 

    } 


    / ** 
     * @ LoginUserパラメーターパーサーを追加
     * @author yanghui 
     * @date 2020/12/17 
     * @return void 
     ** / 
    @Override 
    public void addArgumentResolvers(List <HandlerMethodArgumentResolver> argumentsResolvers){ 
        argumentResolvers.add(getLoginUserHandlerMethodArgumentResolver()); 
    } 

}

5. @LoginUser SimpleUserユーザーパラメーターをコントローラーインターフェイスパラメーターに追加して、使用します。

おすすめ

転載: blog.csdn.net/qq_39008613/article/details/111366665