在springboot项目开发中须要从token中获取用户信息时一般的方式要经历几个步骤java
下面是过程示例代码git
/*--------1.拦截器中获取---------*/ String token =request.getHeader("token") /*--------2.解析---------*/ //若是没过时且有效 if(!TokenUtil.isExpire(token)){ //解析token把结果存入成员变量 TokenUtil.decode(token); } /*--------3.controller中获取---------*/ User currentUser=TokenUtil.getUser();
看上去也没什么复杂指处,可是若是在每一个Controller中都加上一句
User currentUser=TokenUtil.getUser();
感受有些多余(潜意识知道确定有更简洁的方法能减小这里所写代码)web
下面介绍一种使用自定义参数注解的方法简化获取结果spring
@{RequestMethod}Mapping(value="path") public Object methodName(@CurrentUser User user){ //...code }
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; } }
@Configuration public class CustomWebMvcConfigurer implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { //注册拦截器 //拦截规则根据实际状况,请作更改 /** 指全部 /*指1级目录 registry.addInterceptor(new GlobalInterceptor()).addPathPatterns("/*/api/**"); WebMvcConfigurer.super.addInterceptors(registry); } }
@Target({ElementType.PARAMETER})//Annotation所修饰的对象范围:方法参数 @Retention(RetentionPolicy.RUNTIME)//Annotation被保留时间:运行时保留(有效) @Documented//标记注解:java工具文档化 public @interface CurrentUser { }
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"); } }
@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()); } }
@GetMapping(value="/demo/api/testget") public Object getTest(@CurrentUser User currentUser){ System.out.println(currentUser); return currentUser; }
到此就实现了预期的结果,回头看发现虽然多写了很多代码,可是在用的时候仍是更加简洁明了,美丽大方(给本身比个❤)api
gitbook上预览此文章springboot