javaweb商城秒杀系统--分布式session(二)

用户登陆成功的时候会产生一个session,因为是秒杀系统session加入放在集群中的每个机器上面,当用户提取session的时候便会出现session不一致的问题,并且会浪费一定的资源,所以,我们将session存在一台redis的服务器上
一,UUID生成一个唯一cookie

/**
 * @Author:zhangyx
 * @Date:Created in 22:192018/11/15
 * @Modified By:
 */
public class UUIDUtil {

    public static String UUID(){
        return UUID.randomUUID().toString().replace("-","");
    }
}

二、将生成的cookie放入第三方缓存中(redis)
在提前写好的service中,set进我们的token

/**
 * @Author:zhangyx
 * @Date:Created in 22:222018/11/15
 * @Modified By:
 */
public class MiaoshaUserKey extends BasePrefix {

    public static final int TIKEN_EXISTS=3600*24*2;
    public MiaoshaUserKey(String prefix) {
        super(prefix);
    }

    public MiaoshaUserKey(int expireSeconds, String prefix) {
        super(expireSeconds, prefix);
    }

    public static MiaoshaUserKey token=new MiaoshaUserKey(TIKEN_EXISTS,"tk");

    public static MiaoshaUserKey getById=new MiaoshaUserKey(0,"tk");

}

三、获取我们写入的token

    //把生成token给提出来
    public void addCookie(HttpServletResponse response,String token,MiaoshaUser miaoshaUser){
//生成一个自定义cookie
        UUIDUtil.UUID();
        redisService.set(MiaoshaUserKey.token,token,miaoshaUser);
        Cookie cookie=new Cookie(COOKIE_NAME_TOKEN,token);
        cookie.setMaxAge(MiaoshaUserKey.token.expireSeconds());
        cookie.setPath("/");
        response.addCookie(cookie);

    }
    //从缓存中根据token取user
    public MiaoshaUser getByToken(HttpServletResponse response,String token) {
        //延长token的有效期
        if(token==null) {

            return null;
        }

        MiaoshaUser miaoshaUser=redisService.get(MiaoshaUserKey.token,token,MiaoshaUser.class);
        if(miaoshaUser!=null){
            addCookie(response,token,miaoshaUser);
        }

        return miaoshaUser;
    }

四、商品详情页和商品列表中token在controller的使用判断

//商品列表
@RequestMapping("/to_list")
    public String toLogin(Model model, @CookieValue(value =MiaoshaUserService.COOKIE_NAME_TOKEN,required = false)
        String cookieToken, @RequestParam(value = MiaoshaUserService.COOKIE_NAME_TOKEN,required = false)String paramtoken,
                          HttpServletResponse response){
if(StringUtils.isEmpty(cookieToken)&&StringUtils.isEmpty(paramtoken)){
    return "login";
}
String token=StringUtils.isEmpty(paramtoken)?cookieToken:paramtoken;

MiaoshaUser user=userService.getByToken(response,token);
  model.addAttribute("user",user);
    return "goods_list";
}
//商品详情
@RequestMapping("/to_detail")
public String detail(Model model, @CookieValue(value =MiaoshaUserService.COOKIE_NAME_TOKEN,required = false)
        String cookieToken, @RequestParam(value = MiaoshaUserService.COOKIE_NAME_TOKEN,required = false)String paramtoken,
                      HttpServletResponse response){
    if(StringUtils.isEmpty(cookieToken)&&StringUtils.isEmpty(paramtoken)){
        return "login";
    }
    String token=StringUtils.isEmpty(paramtoken)?cookieToken:paramtoken;

    MiaoshaUser user=userService.getByToken(response,token);
    model.addAttribute("user",user);
    return "goods_list";
}

你可能感兴趣的:(练手小项目)