模块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中获取用户的重要信息。
posted on 2020-04-16 21:30 hello,bdiskl 阅读(200) 评论(0) 编辑 收藏 举报