作为 java web 项目,现在应该都是基于 springboot 开发了吧,最近研究了 spring 的参数解析器,发现在部分场景还是挺实用的,现把基于springboot自定义参数解析器的过程分享出来,有需要的可以直接使用现在的项目基本都是前后端分离,维持用户登录态一般都是采用 token 或类似的方法,前端请求接口的时候不需要携带具体的用户信息,只需要携带一个 token,后端校验 token的合法性以及通过token 获取用户信息。实现的方式也简单,封装一个通过token 获取用户信息的方法,在需要通过 token 获取用户信息的地方直接调用方法就可以了。但是需要用户信息的地方都要调用一下这个方法,那么有没有更加优雅的实现方式呢?答案是有的,当然你可以通过自定义切面在需要的地方解。析注入用户信息,其实呢,还有一种更加简单的方式,我们只需要实现 spring 提供的 HandlerMethodArgumentResolver 接口即可。下面我们就通过这种方式来实现一个自定义的参数解析器来在需要的地方自动解析对应的参数
首先定义一个需要解析的对象实体:
Getter
Setter
@NoArgsConstructor aA1lArgsConstructor public class user{
private Long id;
private string name;
private String headpicture;
}
实现解析器:
public class UserArgumentsResolver implements HandlerMethodArgumentResolver{
private RedisTemplateString,User>redisTemplate
public UserArgumentsResolver(RedisTemplate<String, User> template) {
this.redisTemplate = template;
}
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterType() == User.class;
}
@Override
public Object resolveArguement(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) {
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
String token = request.getHeader("X-token");
if (!StringUtils.hasText(token)) {
throw new ServiceException("token不存在");
}
String tokenKey = Constant.USER_TOKEN_PREFIX + token;
User user = redisTemplate.opsForValue().get(tokenKey);
if (user == null) {
throw new ServiceException("登录已失效");
}
return user;
}
}
只有两个方法需要实现,一个是该解析器是否能处理该参数,这里我们判断参数是我们需要解析的类型的时候进行处理。另一个是真正解析参数的实现(一般是通过 token 从缓存中获取),实现完解析器以后,需要把我们自己实现这个解析器添加到 spring 的参数解析器集合中:
@Configuration
public class CustomMvcConfig implements WebMvcConfigurer {
@Autowired
private Resitemplate<String,User> template;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resovers) {
resolvers.add(new userArgumentResolver(template));
}
}
至此,主要的逻辑已经完成了,我们写一个接口进行测试:
@RestController
public class IndexController {
@PostMapping("/index")
public String index(User user) {
return JSON.toJSONString(user);
}
}
现在,只需要在需要使用用户信息的 controller 直接添加 User 参数即可,系统就会自动注入对应的用户信息。
好了,今天的内容就分享到这里了,一个小技巧,希望对你有帮助。