如何让同一服务,ip域名session共享。
来源:互联网 发布:session用法 java 编辑:程序博客网 时间:2024/05/18 01:15
这几天碰到一个问题,一个统一登录服务配置了域名,但是要求用户不管通过域名访问还是ip访问,保证都能登录成功。
服务本身就是负载的,一个nginx下面配置了多个一样的服务,所以第一步应该保证这些分布式应用session是共享的,我们采用了分布式共享session,也就是redis+cookie。所有服务连接同一redis集群,实现session共享,服务端生成cookie到浏览器。
因为cookie生成的限制,domain只能是用户访问本身所输入的地址,例如用户输入http://lcaolhost:8080那么服务生成的cookie的domain为localhost,如果输入http://127.0.0.1:8080那么服务生成的cookie的domain为127.0.0.1,所以就造成了生成的cookie不一样,同事cookie里面存放的sessionId也不一样,浏览器会认为你是访问了两个服务,就造成了域名和ip访问不一致。
为了解决这个问题,我就想着在用户登录成功后同时给他生成另一个cookie不就行了,里面存放一样的sessionId,于是就有了下面的代码。
String sessionId = request.getParameter("sessionId");Cookie cookie = new Cookie("SSO-SID", sessionId); cookie.setDomain("127.0.0.1"); cookie.setPath("/");response.addCookie(cookie); //将cookie返回到客户端request.getRequestDispatcher("/index.html").forward(request,response);
大体意思是当用户访问localhost:8080/xxxx登录成功后生成额外生成一个127.0.0.1的cookie,结果肯定是失败了。因为浏览器认为你生成了其他网站的cookie,自然是不行。
所以我就想着转发一下,绕一下,让服务自己生成自己的,于是有了下面的代码。
在访问http://localhost:8080/login登录页面时,将sessionId获取返回到页面。
String JSESSIONID = request.getSession().getId();model.addAttribute("sessionId",JSESSIONID);
<script th:src=http://127.0.0.1:8080/cologin?sessionId=xxxxxx></script>
@RequestMapping(path="/cologin",method=RequestMethod.GET)public void revokeToken(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String sessionId = request.getParameter("sessionId"); Cookie cookie = new Cookie("SSO-SID", sessionId);//cookie.setDomain(""); //这里可以不同填写,默认就是访问地址cookie.setPath("/");response.addCookie(cookie); //将cookie返回到客户端request.getRequestDispatcher("/index.html").forward(request,response);}
其实,这种方法也可以用作多个不同域名的情形,或者多个不同的服务域名也不相同的情形。而且这里可以做一下安全校验,就是传输sessionId的时候不用明文传送,可以用作一个随机字符串或者主键,将这个字符串和redis或者数据库里面的session绑定即可。
- 如何让同一服务,ip域名session共享。
- 同一服务器不同域名session共享
- 同一域名下 session无法共享的问题?
- 同一域名不同站点共享forms验证
- php子域名共享session
- 域名间的session共享
- laravel session多域名共享
- apache2 同一ip 多域名 虚拟主机配置
- apache2 同一ip 多域名 虚拟主机配置
- 同一ip绑定多个域名
- 多个域名指向同一主机IP
- nginx同一iP多域名配置方法
- Wamp配置文件,多域名指向同一IP
- APACHE 同一IP绑定多个域名
- nginx同一iP多域名配置方法
- nginx同一iP多域名配置方法
- nginx同一iP多域名配置方法
- 同一ip绑定多个域名
- torque配置
- Ubuntu系统用户忘记密码怎么办?
- matlab2015a连接mysql数据库
- SpringMVC国际化
- Unity 项目与iOS项目 合并 嵌入 交互 传值
- 如何让同一服务,ip域名session共享。
- C++STL--map和set词频统计和单词转换
- spring-boot+JPA+Thymeleaf动态生成select下拉选
- 行业资深人士预测:2018年新能源汽车技术发展趋势---凯利讯半导体
- 当我们讨论软降工程的时候在讨论什么
- 内网穿透一
- 二叉树节点间的最大距离问题
- windows下安装hadoop时找不到JAVA_HOME: JAVA_HOME is incorrectly set.
- Python与Anaconda离线安装TensorFlow For Windows