前言
有这样一个场景,在某个控制器中的参数中,需要从Request的Header中取到Authorization请求头,其中Authorization是Jwt的身份Token,我们需要取到Token中的uid字段,以用来判断当前的用户身份,在没有使用任何的权限身份管理框架的前提下,那么我们只能在Controller层进行一步步的调取,如果是有多个控制器的话,这样会增加很多的冗余代码,于是我们可以考虑使用自定义注解来实现类似于SpringBoot的参数注入。
正文
首先,我们需要定义一个自定义注解,命名为JwtToken
:
1 2 3 4 5 6 7 | @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface JwtToken { String value() default "uid"; } |
接下来我们需要一个解析器,其实在SpringBoot中已经为我们提供了相关的处理解析器-HandlerMethodArgumentResolver,我们只需要实现接口完成业务逻辑处理即可。
supportsParameter
supportsParameter接口是用于判断是否需要对该参数进行解析,如果该接口的返回值为true,则会继续执行resolveArgument接口方法,所以我们这里应为:
1 2 3 4 | @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(JwtToken.class); } |
resolveArgument
resolveArgument
接口是处理参数的分解,只有supportsParameter
为true时才会调用此方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); String authorization = request.getHeader("Authorization"); String result = null; JwtToken token = null; if(authorization!=null){ Annotation[] methodAnnotations = parameter.getParameterAnnotations(); for (Annotation methodAnnotation : methodAnnotations) { if(methodAnnotation instanceof JwtToken){ token = (JwtToken) methodAnnotation; break; } } if(token!=null){ result = JwtUtil.get(authorization,token.value()); } } return result; } |
其中我的JwtUtil中取Token中的信息的方法为:
1 2 3 4 5 6 7 8 | public static String get(String token,String key) { try { DecodedJWT jwt = JWT.decode(token); return jwt.getClaim(key).asString(); } catch (JWTDecodeException e) { return null; } } |
然后将我们写好的Resolver注入到SpringMVC的ArgumentResolvers
中,如:
1 2 3 4 5 6 7 | @SpringBootConfiguration public class SpringMvcConfig extends WebMvcConfigurerAdapter { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { argumentResolvers.add(new JwtTokenArgumentResolver()); } } |
到这一步我们的所有步骤就已经完成了,于是我们可以给需要取值的参数加上@JwtToken
即可,例如:
1 2 3 4 | @GetMapping public ResponseResult list(@JwtToken String uid){ return ResponseResult.okHasData(shopsService.list(uid)); } |
- 微信号:sqymail
- 微信扫一扫欢迎加我为好
-
- 交流QQ群号:248249544
- IntelliJ IDEA,Java 技术交流
-