Springboot using custom parameter acquiring annotation data token user

Use custom parameter annotation get in User data token

Use Background

When users need to get information from the token in springboot project development in the usual way to go through several steps

  1. Interceptor intercepted token
  2. User information TokenUtil analytical tools in the token
  3. The analytical result is stored in the member variable
  4. controller user information acquired by the static method provides tools TokenUtil

The following sample code is the process

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

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

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

Looks at the finger nothing complicated, but if you are plus in each Controller in a
User currentUser=TokenUtil.getUser();sense somewhat redundant (subconsciously know there must be more concise method can reduce the code written here)

The following describes a method using a self-defined parameter annotation simplified acquisition result

Finally, the effect desired

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

Start of Text

1. interceptor code (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. Register interceptor (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 category (CurrentUser.java)

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

4. CurrentUser annotation implementation class (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");
    }
}

The implementation class annotated register (ServerApplication.java) at startup class SpringBoot

@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. In the Controller

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

This will achieve the expected results, found that although looking back and writing a lot of code, but still in time with more concise, beautiful and generous (for himself than a ❤)

Preview this article on gitbook

Guess you like

Origin www.cnblogs.com/roseAT/p/11828318.html