首先,前面利用token获取用户登录信息,并传输到页面。
如果每个接口都进行一次这样的操作将非常多余,
那么如何让每个接口自动的获取这个user对象呢?
通过ArgumentReslover参数解析器识别该对象,利用WebMvcConfigurerAdapter接口中addArgumentResolvers方法自动注入
参考:ArgumentReslover
- 定义Controller
下面是前面在接口中通过cookie中的token找到的user对象
@RequestMapping("/to_list")
public String list(HttpServletResponse response, Model model,
@RequestParam(value=SeckillUserService.COOKI_NAME_TOKEN,required=false)String parmaToken,
@CookieValue(value=SeckillUserService.COOKI_NAME_TOKEN,required=false)String cookieToken) {
if(StringUtils.isEmpty(parmaToken)&&StringUtils.isEmpty(cookieToken)){
return "login";
}
//由于我们不知道请求可能传输cookie的方式,所以我们用两种都接收,,required=false为非必须
String token = StringUtils.isEmpty(parmaToken)?cookieToken:parmaToken;
SeckillUser user = seckillUserService.getByToken(response,token);
model.addAttribute("user", user);
return "goods_list";
}
我们的目的是直接注入这个user对象,而user对象通过全局获取
@RequestMapping("/to_list")
public String list(Model model,SeckillUser user){
model.addAttribute("user",user);
return "goods_list";
}
- 定义参数控制器
ArgumentResolver
@Service
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
Logger log = LoggerFactory.getLogger(UserArgumentResolver.class);
@Autowired
SeckillUserService seckillUserService;
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
Class<?> clazz = methodParameter.getParameterType();
return clazz == SeckillUser.class;
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class);
String paramToken = request.getParameter(SeckillUserService.COOKI_NAME_TOKEN);
String cookieToken = getCookieValue(request, SeckillUserService.COOKI_NAME_TOKEN);
if(StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)) {
return null;
}
String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
log.info(token);
return seckillUserService.getByToken(response, token);
}
private String getCookieValue(HttpServletRequest request, String cookiName) {
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies) {
if(cookie.getName().equals(cookiName)) {
return cookie.getValue();
}
}
return null;
}
}
在配置容器中加入该ArgumentResolver
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Autowired
UserArgumentResolver userArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver);
}
}
- 测试

本文介绍了一种在每个接口自动获取并注入用户对象的方法,通过定义UserArgumentResolver实现HandlerMethodArgumentResolver接口,配合WebMvcConfigurerAdapter的addArgumentResolvers方法,避免了重复的token验证过程。
1047

被折叠的 条评论
为什么被折叠?



