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;}

```


posted @ 2021-07-10 21:39  weidalin  阅读(52)  评论(0)    收藏  举报