模块3之实现分布式session

简介

  session,token,cookie,这几个词真是搞得我头大,他们到底有什么联系和区别呢?今天就来翻译翻译什么是session,什么他妈的是session,什么他妈的是他妈的session?

分布式session:当用户访问网站时,服务器会存储一些用户的重要信息,当用户下次发出请求时读取这些重要的信息;但是,网站通常配备多台服务器,可能用户的所用请求不会

全落到同一台服务器上,所以需要实现,一台服务器保存的用户的重要信息可以被每台服务器获取。

说明:本博文代码来自Java秒杀项目

准备:

redis服务器,会将用户重要信息存储在redis服务器;被存储的用户重要信息:MySQL中存储的用户对应的记录,实际开发时不会是这些内容。

用户登录时将重要信息缓存到redis中

1 String token = UUIDUtil.UUID();
2 addCookie(httpResponse,token,miaoshaUser);
 1 /*
 2     *将token放入redis和response中
 3      */
 4     private void addCookie(HttpServletResponse httpResponse,String token,MiaoshaUser miaoshaUser){
 5         redisService.set(MiaoshaUserPrefix.getBytoken,token,miaoshaUser);
 6                                                                                                                         //将token值返回给浏览器端
 7         Cookie cookie = new Cookie(TOKEN_NAME,token);
 8         cookie.setMaxAge(MiaoshaUserPrefix.getBytoken.expireSeconds);                             //M.g.expireSeconds=3600*24*2 (两天)
 9         cookie.setPath("/");
10         httpResponse.addCookie(cookie);
11     }

token本质为一个随机字符串,它在此处的功能为一个标识符,一个token对应一条redis缓存;因为在redis缓存中将token设为了key,而value为重要信息。

我们将token放到cookie中,并设置过期时间为2天,访问本项目根目录下所有路径都会携带,将cookie放到httpResponse返回给浏览器。

获取用户的重要信息

使用下面的方法来获取存储在redis中的用户的重要信息。只需要用户的request中得到token值,任何的服务器都可以获得用户的重要信息。

 1 /**
 2      * 通过request提供的cookie获得MiaoShaUser对象
 3      */
 4     private MiaoshaUser getMiaoshaUser(HttpServletRequest request, HttpServletResponse response){
 5         String paramToken = request.getParameter(MiaoshaUserService.TOKEN_NAME);
 6         String cookieToken = getCookieValue(request,MiaoshaUserService.TOKEN_NAME);
 7         //使用cookie得到对象
 8         if (StringUtils.isEmpty(cookieToken)&&StringUtils.isEmpty(paramToken)) {
 9             return null;
10         }
11         String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;   //优先取paraToken
12         MiaoshaUser user = miaoshaUserService.getByToken(token,response);
13         return user;
14     }
 1 /*
 2      *   获得request中的cookie值
 3     */
 4     private String getCookieValue(HttpServletRequest request, String tokenName) {
 5         Cookie[] cookies = request.getCookies();
 6         if(cookies==null || cookies.length<=0){
 7             return null;
 8         }
 9         for (Cookie c:cookies
10         ) {
11             if (c.getName().equals(tokenName)) {
12                 return c.getValue();
13             }
14         }
15         return null;
16     }

手机用户可能会将token作为一个Parameter放到HttpServletRequest中,所以要在两个地方去获取token值。

一个使用request.getParameter()方法来获取token;另一种,获取request中所有的cookie,然后遍历cookie,即方法getCookieValue。

总结

通过上面的设计,任何服务器收到用户的请求后都能从redis中获取用户的重要信息。

原文地址:https://www.cnblogs.com/deijiawoyu/p/12715940.html