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号
浙公网安备 33010602011771号