ユーザー・データ・トークンに使用し、カスタムパラメータの注釈を取得
使用の背景
ユーザーは、いくつかの段階を経るための通常の方法でspringbootプロジェクトの開発にトークンから情報を取得する必要がある場合には
- インターセプタはトークンの傍受しました
- トークン内の分析ツールTokenUtilユーザー情報
- 分析結果は、メンバ変数に格納されます。
- 静的な方法によって取得されたコントローラのユーザ情報は、ツールを提供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;
}
これは、期待される結果を達成する、けれども(❤よりも自分のために)より簡潔、美しいと寛大なを振り返って、コードの多くを書いて、まだ時間にことがわかりました