单点登录Redis存储Session及SessionId问题说明与集群实战-3
那现在我们就是要把sessionID的login请求,我们再看一下redis,回到我们的代码,我们现在不请求localhost:8080了,我们要请求happymall.com,因为我们 已经把他配置了host,它会像我们读取的网站一样,一会请求tomcat1,一会请求tomcat2,那我们把这个名字改一下,我们把redis清空一下flushdb;keys *
这个时候我们请求打到tomcat2上,我们看一下writeLoginUser,进来,我们这个时候拿到的token是4B13k开头的,这个token就是我们要存在redis里面的,并且domain一级域名下面的,然后放到response里面,addCookie,这个时候response还没有返回,所以我们在浏览器里面,并且我们这个请求504超时了,504是nginx的超时时间,所以大家看到这个错误不要惊慌,这是正常的,我们可以去修改nginx的超时时间,很简单的,因为我们现在主要是讲这个方法的调试,然后我们read一下我们进去,读取的cookie都有两个,有什么,JSESSIONID,下面还有一个mmall_login_token
但这个58A1是什么,是我们之前把这个断点,放过去,已经存到redis里的cookie,其实我们已经read过来了,我们可以看到已经返回了
继续删除loginToken,这里面也很简单,进去之后各种判断
然后把它set到redis里面keys *4B13就在这里面了
在这里要set一个,httpOnly,为true,那设置这个呢,是为了防止脚本攻击,这个属性规定,不允许通过脚本访问cookie,在使用httpOnly这个cookie之后呢,断点就能够排除敏感信息,被发送给黑客的计算机,或者使用脚本的web断点的可能性,那我们的代码这样设置之后,是无法通过脚本来获取这个信息的,同时浏览器也不会把cookie,发送给任何第三方,这样就保证了信息的安全,当然他无法全面的保障我们断点的防止脚本攻击的安全,但是能提高一定的安全性,那是因为我们用的tomcat7,默认是servlet3.0,属性可以直接设置,如果使用tomcat6的话,那这个属性要重新加用一下,tomcat6提供的servlet2.x,并不提供set方法,那之前的做法呢,就是把这个属性设置在头里,然后我们再说一下,domain和path之间的关系,我们直接在这里加上注释,A.happymall.com,第二个B.happymall.com,第三个A.happymall.com/test/cc,第四个A.happymall.com/test/dd,第五个A.happymall.com/test,那现在对于这几个断点是这样的,//X:domain=".happymmall.com"//a:A.happymmall.com cookie:domain=A.happymmall.com;path="/"//b:B.happymmall.com cookie:domain=B.happymmall.com;path="/"//c:A.happymmall.com/test/cc cookie:domain=A.happymmall.com;path="/test/cc"//d:A.happymmall.com/test/dd cookie:domain=A.happymmall.com;path="/test/dd"//e:A.happymmall.com/test cookie:domain=A.happymmall.com;path="/test"A和B是二级域名,所以a拿不到b的cookie,因为他们是同级的,然后说c和d,能共享a的cookie,同样的c和d呢,也能共享e的cookie,可以看一下test,e的cookie是这样的,所以c和d也能共享e的cookie,他们能读取到e的cookie,但是c拿不到d的,d拿不到c的,c和d也拿不到b的,那他们之间的关系就是这样的,非常简单,也很容易理解,那我们就把domain设置成一级域名,path就设置成根目录下,这样就比较通用,而且也比较简单,那我们就要抱着发展的思想来看这个问题
private final static String COOKIE_DOMAIN = ".happymmall.com";private final static String COOKIE_NAME = "mmall_login_token";//X:domain=".happymmall.com"//a:A.happymmall.com cookie:domain=A.happymmall.com;path="/"//b:B.happymmall.com cookie:domain=B.happymmall.com;path="/"//c:A.happymmall.com/test/cc cookie:domain=A.happymmall.com;path="/test/cc"//d:A.happymmall.com/test/dd cookie:domain=A.happymmall.com;path="/test/dd"//e:A.happymmall.com/test cookie:domain=A.happymmall.com;path="/test"public static void writeLoginToken(HttpServletResponse response,String token){Cookie ck = new Cookie(COOKIE_NAME,token);ck.setDomain(COOKIE_DOMAIN);ck.setPath("/");//代表设置在根目录ck.setHttpOnly(true);//单位是秒。//如果这个maxage不设置的话,cookie就不会写入硬盘,而是写在内存。只在当前页面有效。ck.setMaxAge(60 * 60 * 24 * 365);//如果是-1,代表永久log.info("write cookieName:{},cookieValue:{}",ck.getName(),ck.getValue());response.addCookie(ck);}
还记得我们之前设置host的时候,当时是有一个user.happymall.com的,我们简单说一下,那这个域名现在没有启用,如果要启用的话呢,也是127.0.0.1,我们线上也没有配置,随着我们项目的不断演进,我们价格的演进,那么在后续的时候,我们会把用户相关的,登陆注册,找回密码,忘记密码,重置密码,获取用户信息,包括管理员的权限判断,全部抽取出来一个单独的服务,我们可以叫他用户中心,那么这个时候我们这个服务呢,以现在我们这种写法是可以通用的,例如我们把cookie是放在一级域名下的,那我们在user.happymall.com里面,那我们的user.happymall.com,这里面所有关于登陆所有session共享的,这些代码也都是OK的,因为它能够拿到这里面的cookie,那当然这是一个服务化的思想
那现在是打到TOMCAT2上
现在打到tomcat1上,我们再看一下cookie,JSESSIONID和刚才的tomcat2的不一样,但是mmall_login_token,8B63,是一样的,那我们在读取用户信息的时候,就那mmall_login_token这个value,去redis里面查,可以查到了,这样无论是tomcat1还是tomcat2,都能读到用户信息
我们看一下redis里面
那这个就是用户信息了,所以呢现在,我们这个cookie已经进入到一级域名下了,可以看到这个domain,这个就是我们设置的maxage,我们设置的是一年,那继续来验证他,我们还有一个get_user_info方法,获取用户信息,我们看看这个请求
在代码里是POST请求,405 METHOD not allowed,这里我们要改成post,我们改成form,用户未登录,用户无法获取当前信息
为什么会报这个错呢,很简单,看一下我们的代码,我们这里面还是在session里面去拿,那接下来我们就要改造他,就是从cookie拿到mmal_login_token,然后从redis里面获取这个用户信息,同时还能演示我们的readCookie
@RequestMapping(value = "get_user_info.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<User> getUserInfo(HttpServletRequest httpServletRequest){String loginToken = CookieUtil.readLoginToken(httpServletRequest);if(StringUtils.isEmpty(loginToken)){return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户的信息");}String userJsonStr = RedisShardedPoolUtil.get(loginToken);User user = JsonUtil.string2Obj(userJsonStr,User.class);if(user != null){return ServerResponse.createBySuccess(user);}return ServerResponse.createByErrorMessage("用户未登录,无法获取当前用户的信息");}
单点登录Redis存储Session及SessionId问题说明与集群实战-3相关推荐
- 单点登录Redis存储Session及SessionId问题说明与集群实战-1
断点已经到这儿了,sessionId我们看一下,sessionId是B218,我们把value copy一下 放到这里,然后让Redis存上,key就是session的id,value就是user,后 ...
- 单点登录Redis存储Session及SessionId问题说明与集群实战-4
现在就是要改造我们getUserInfo,因为我们不会再从session里面获取用户,首先我们要哪一个login_token,这个时候拿到loginToken,如果loginToken是empty的话 ...
- 单点登录Redis存储Session及SessionId问题说明与集群实战-2
我们要写什么呢,我们要在服务端写一个cookie,而这个cookie呢,是写在客户端上的,那他写的就是登陆时候的,sessionId,非常简单,我们开始写一下,首先新建一个类,我们就在util里面创建 ...
- 单点登录Redis存储Session及Cookie场景介绍
首先response如果是成功的话,就是登陆成功,我就不往session里面放值了,直接调用RedisPoolUtil,setEx方法,在设置的时候,直接把他的时间加上,key就用session.ge ...
- yii2设置session时间_关于 Swoft 2.0 版本用 Redis 存储 session 时配置问题
Swoft 2.0 在 session 配置上和 1.0 还是有一些不同地方,而关于这些在 github 上完全没有任何说明,甚至连文档也没有.经过逐步梳理源代码(其中要理解他的 "注解&q ...
- 使用Redis缓存Shiro授权认证信息,搭建集群权限系统
应用如果做负载均衡,集群间session需要共享,如果session没有共享,用户登录系统以后session保存在登录的应用里面,其他应用里面没有session,没有登陆状态,访问会失败.下面介绍一个 ...
- redis的三大模式主从,哨兵和集群
一.前言 二.redis主从复制 1.主从复制的作用: 2.主从复制的流程 3.搭建主从复制 3.1.搭建环境 3.2.安装redis 3.3.主服务器配置查看以下行 3.4.从服务器配置查看以下行 ...
- Redis高可用——主从复制、哨兵模式、集群
文章目录 一.Redis高可用 1.什么是高可用 2.Redis的高可用技术 二.Redis主从复制 1.Redis主从复制的作用 2.主从复制的流程 三.主从复制的搭建 实验准备 1.所有主机安装R ...
- Redis实践(二)高可用的集群+哨兵部署
项目中通常会需要若干台Redis服务器来协同担当起内存数据库的工作,在redis的部署方案上要考虑下面几点: 结构上,单个 Redis 服务器会发生单点故障,而且一台服务器需要承受所有的请求负载. 这 ...
最新文章
- linux 内核 call,在Linux Kernel內新增一个System Call(转)
- 环境污染,拿什么来保障食品安全?
- 召回:是塔,是塔,但不是双塔!
- 疯狂吸金1600个亿的拼多多,社交网络分析到底隐藏多少财富?
- dataframe输出某列的数据以及统计某列的取值种数+输出某行数据
- 人才管理是什么意思_上海托管仓库外包仓库管理什么意思
- 10、使用ws调用Rest api
- python pop函数 索引_[python] 字典和列表中的pop()函数
- oracle merge
- bfs--最小步数--青蛙
- 使用python连接eNSP中交换机并添加配置
- zabbix详解(十一)——zabbix监控MySQL性能实战
- python表白代码简单
- S32K1xx 系列安全手册
- 高斯白噪声仿真-复信号分析
- 我是这样来做破解qq,做QQ外挂的 【-】
- WebGIS前端框架(openlayers,mapbox,leaflet)图形图像底层渲染原理分析
- ros 校验数字签名时出错。此仓库未被更新,所以仍然使用此前的索引文件。
- JavaScript学习笔记 06、DOM元素—③定时器与延时器
- 回望2018,这6家AI+教育公司亮了!| AI最佳掘金案例榜...