4. 分布式session
1 登录操作的controller
@RequestMapping("/do_login")
@ResponseBodypublic Result<Boolean> doLogin(HttpServletResponse response, @Valid LoginVo loginVo){
log.info(loginVo.toString()); Boolean b = miaoshaUserService.login(response, loginVo); return Result.success(true);}2 登录的时候添加user对象到cookie, (service)
addCookie(response, user);
private void addCookie(HttpServletResponse response, MiaoshaUser user){
// 生成 cookie String token = UUIDUtil.uuid(); // 在redis 中保存token redisService.set(MiaoshaUserKey.token, token, user); // 生成 Cookie Cookie cookie = new Cookie(COOKIE_NAME_TOKEN, token); // 设置cookie 过期时间,保持与redis 一致 cookie.setMaxAge(MiaoshaUserKey.token.expireSeconds()); // 设置目录 cookie.setPath("/"); response.addCookie(cookie);}3 成功之后,ajax代码中进行跳转到下一个页面
$.ajax({
url: "/login/do_login",
type: "POST",
data:{
mobile:$("#mobile").val(),
password: password
},
success:function(data){
layer.closeAll();
if(data.code == 0){
layer.msg("成功");
window.location.href="/goods/to_list";
}else{
layer.msg(data.msg);
}
},
error:function(){
layer.closeAll();
}
});4 即将跳转到商品列表中controller to_list
@RequestMapping("/to_list")
public String toLogin( Model model,// HttpServletResponse response,// @CookieValue(value=MiaoshaUserService.COOKIE_NAME_TOKEN, required = false) String cookieToken,// @RequestParam(value=MiaoshaUserService.COOKIE_NAME_TOKEN, required = false) String paramToken, MiaoshaUser user){
// if(StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)){// return "login";// }// String token = StringUtils.isEmpty(paramToken) ? cookieToken : paramToken;// MiaoshaUser user = miaoshaUserService.getByToken(response, token); model.addAttribute("user", user); return "goods_list"; }
### 4.9 创建webconfig包,编写WebConfig类,
重写WebMvcConfigurerAdapter 里的addArgumentResolvers方法, 然后重写他的处理方法,处理方法写在UserArgumentResolver 类里面
@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter {
@Autowired UserArgumentResolver userArgumentResolver; @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver); }
}
### 5 跳转到商品列表页面成功之后,需要取出cookie, 因为有很多页面都需要取出cookie, 因此取出cookie操作封装起来
- 1 编写UserArgumentResolver 类, 实现HandlerMethodArgumentResolver 接口
@Servicepublic class UserArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired MiaoshaUserService miaoshaUserService;
- 2 重写supportsParameter 方法, 只对MiaoshaUser 进行处理@Overridepublic boolean supportsParameter(MethodParameter methodParameter) {
Class<> clazz = methodParameter.getParameterType(); return clazz == MiaoshaUser.class;}
- 重写resolveArgument 方法,
+ 获取request、 reponse 对象
+ 从MiaoshaUserService 对象以及request对象中都取出Token, MiaoshaUserService 中取出的是paramToken ,从request对象中取出的是cookieToken 。
+ 判断两个取出的token, 如果都为空,那么要返回去登录
+ 最终需要的token,以paramToken 优先级高于 cookieToken , 因为cookieToken 可能是放在浏览器中的,不一定是最新的
+ 从resis中根据token获取user
+ 每一次取出token的同时传参response对象,延长cookie的有效期@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(MiaoshaUserService.COOKIE_NAME_TOKEN); String cookieToken = getCookieValue(request, MiaoshaUserService.COOKIE_NAME_TOKEN); if(StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)){
return "login"; }
String token = StringUtils.isEmpty(paramToken) ? cookieToken : paramToken; MiaoshaUser user = miaoshaUserService.getByToken(response, token); return user; }
private String getCookieValue(HttpServletRequest request, String cookieNameToken) {
Cookie[] cookies = request.getCookies(); for(Cookie cookie : cookies){
if(cookie.getName().equals(cookieNameToken)){
return cookie.getValue(); }
}
return null;}
public MiaoshaUser getByToken(HttpServletResponse response, String token) {
if(StringUtils.isEmpty(token)){
return null; }
MiaoshaUser user = redisService.get(MiaoshaUserKey.token, token, MiaoshaUser.class); // 延长有效期 if(user != null){
addCookie(response, user); }
return user;}
```


浙公网安备 33010602011771号