- 自定义user注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoginTblUser {
/**
* 是否查询User对象所有信息,true则通过rpc接口查询
*/
// boolean isFull() default false;
}
- 实现方法参数解析接口 HandlerMethodArgumentResolver
@Slf4j
public class XqTokenArgumentResolver implements HandlerMethodArgumentResolver {
/**
* 入参筛选
*
* @param methodParameter 参数集合
* @return 格式化后的参数
*/
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
//判断使用注解的对象是否为用户对象,是则执行resolveArgument方法
return methodParameter.hasParameterAnnotation(LoginTblUser.class) && methodParameter.getParameterType().equals(Tbluser.class);
}
/**
* @param methodParameter 入参集合
* @param modelAndViewContainer model 和 view
* @param nativeWebRequest web相关
* @param webDataBinderFactory 入参解析
* @return 包装对象
*/
@Override
public Object resolveArgument(MethodParameter methodParameter,
ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest,
WebDataBinderFactory webDataBinderFactory) {
//获取注解对象
LoginTblUser loginUser = methodParameter.getParameterAnnotation(LoginTblUser.class);
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
String userId = request.getHeader(SecurityConstants.USER_ID_HEADER);
if(StringUtils.isEmpty(userId)){
throw new GetUserInfoException("未获取到用户信息");
}
String username = request.getHeader(SecurityConstants.USER_HEADER);
try {
username = URLDecoder.decode(username,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// String roles = request.getHeader(SecurityConstants.ROLE_HEADER);
// if (StrUtil.isBlank(username)) {
// log.warn("resolveArgument error username is empty");
// return null;
// }
Tbluser user = new Tbluser();
user.setUsercode(userId);
user.setUsername(username);
return user;
}
}
- 实现WebMvcConfigurer接口重写addArgumentResolvers方法将XqTokenArgumentResolver类添加进argumentResolvers中。
public class DefaultWebMvcConfig implements WebMvcConfigurer {
@Lazy
@Autowired
//**如需查询用户全部信息,可以在此注入service,将他作为参数传入方法参数解析实现类中的构造函数中,在resolveArgument方法中查询**
private UserService userService;
/**
* Token参数解析
*
* @param argumentResolvers 解析类
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
//注入用户信息
argumentResolvers.add(new TokenArgumentResolver(userService));
//注入应用信息
argumentResolvers.add(new ClientArgumentResolver());
argumentResolvers.add(new XqTokenArgumentResolver());
}
}
4.使用方法:在controller里,需要获取用户信息的在方法中使用注解@LoginTblUser(注解为上自定义注解) 标注在用户对象前即可
/**
* 修改试验机台资料
*/
@ApiOperation("修改试验机台资料")
@PutMapping
public ResponseResult edit(@RequestBody LimsDevice limsDevice, @LoginTblUser Tbluser tbluser) {
limsDevice.setMuser(tbluser.getUsercode());
return limsDeviceService.updateLimsDevice(limsDevice);
}