ユーザートークン注釈データを取得し、カスタムパラメータを使用してSpringboot

ユーザー・データ・トークンに使用し、カスタムパラメータの注釈を取得

使用の背景

ユーザーは、いくつかの段階を経るための通常の方法でspringbootプロジェクトの開発にトークンから情報を取得する必要がある場合には

  1. インターセプタはトークンの傍受しました
  2. トークン内の分析ツールTokenUtilユーザー情報
  3. 分析結果は、メンバ変数に格納されます。
  4. 静的な方法によって取得されたコントローラのユーザ情報は、ツールを提供TokenUtil

以下のサンプルコードは、プロセスであります

/*--------1.拦截器中获取---------*/
String token =request.getHeader("token")

/*--------2.解析---------*/
//如果没过期且有效
if(!TokenUtil.isExpire(token)){
    //解析token把结果存入成员变量
    TokenUtil.decode(token);
}

/*--------3.controller中获取---------*/
User currentUser=TokenUtil.getUser();

指の何を見ては、複雑な、しかし、あなたは、各コントローラにプラスであれば
User currentUser=TokenUtil.getUser();意味やや冗長(無意識のうちにここに書かれたコードを減らすことができ、より簡潔な方法が存在する必要があります知っています)

以下は、自己定義されたパラメータ注釈簡略取得結果を用いた方法を記載しています

最後に、効果は、所望の

@{RequestMethod}Mapping(value="path")
public Object methodName(@CurrentUser User user){
    //...code
} 

テキスト開始

1.インターセプタ・コード(GlobalInterceptor.java)


public class GlobalInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token=request.getHeader("token");
        //判断路径需要拦截
        //....code

        //如果token有效
        if(!TokenUtil.isExpire(token)){
            User user = TokenUtil.getUser(token);
            //我们将解析的用户结果先放入session中
            request.getSession().setAttribut("currentUser",user);
        }

        return true;
    }
}

2.登録インターセプター(CustomWebMvcConfigurer.java)

@Configuration
public class CustomWebMvcConfigurer implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
            //注册拦截器
            //拦截规则根据实际情况,请做更改 /** 指所有 /*指1级目录
            registry.addInterceptor(new GlobalInterceptor()).addPathPatterns("/*/api/**");
            WebMvcConfigurer.super.addInterceptors(registry);
    }
}

3. Notesのカテゴリ(CurrentUser.java)

@Target({ElementType.PARAMETER})//Annotation所修饰的对象范围:方法参数
@Retention(RetentionPolicy.RUNTIME)//Annotation被保留时间:运行时保留(有效)
@Documented//标记注解:java工具文档化
public @interface CurrentUser {
    
}

4. CurrentUserに注釈実装クラス(CurrentUserHandlerMethodArgReslover.java)

public class CurrentUserHandlerMethodArgReslover implements HandlerMethodArgumentResolver {

    /**
    * 判断是否支持使用@CurrentUser注解的参数
    */
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        //如果该参数注解有@CurrentUser且参数类型是User
        return methodParameter.getParameterAnnotation(CurrentUser.class) != null &&methodParameter.getParameterType() == User.class;
    }

    /**
    * 注入参数值
    */
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        //取得HttpServletRequest
        HttpServletRequest request= (HttpServletRequest) nativeWebRequest.getNativeRequest();
        //取出session中的User
        return (User)request.getSession().getAttribute("currentUser");
    }
}

スタートアップクラスSpringBootでの実装クラス注釈付きレジスタ(ServerApplication.java)

@SpringBootApplication
public class ServerApplication extends WebMvcConfigurationSupport {

    /**
     * 启动入口
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(ServerApplication.class,args);
    }

    @Override
    protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers){
        //注册@CurrentUser注解的实现类
        argumentResolvers.add(new CurrentUserHandlerMethodArgReslover());
    }
}

コントローラ6.

@GetMapping(value="/demo/api/testget")
public Object getTest(@CurrentUser User currentUser){
    System.out.println(currentUser);
    return currentUser;
}

これは、期待される結果を達成する、けれども(❤よりも自分のために)より簡潔、美しいと寛大なを振り返って、コードの多くを書いて、まだ時間にことがわかりました

gitbookこの記事をプレビュー

おすすめ

転載: www.cnblogs.com/roseAT/p/11828318.html