谈谈我的session跨域处理方法
情景:公司的一个网站有一个模块(测试模块)需要单独用另外的一个域名(www.xyz.com)去访问,即网站需要用两个不同的域名去访问,如首页(www.abc.com)和测试模块(www.xyz.com)
这时候就涉及到session跨域问题,因为域名不是父子关系,所以必须要实现完全跨域,想到了以下三个解决办法:
1.URL传参:测试模块访问的时候,地址www.xyz.com后把主域名的session通过参数的形式传递过去,如:www.xyz.com;jsessionid=7D4DED1F2DB5BC53961EFED18BCE7E30
2.SSO单点登录
3.利用jsonp的跨域特性,通过ajax进行session传递
第一种方案考虑URL传参数不美观以及URL需要分享给别人的时候就没法获取到session,所以放弃
第二种SSO单点登录方案应该在三种方案中最优的,因为系统架构问题,所以也放弃
目前采用的是第三种方案:
1.把网站主域名的头部和测试模块的头部分开,在测试模块的头部加入以下js代码:
(使用测试模块域名www.xyz.com进行网站访问的时候,利用jsonp跨域特性去主域名www.abc.com获取session信息,然后把session信息设置到测试模块域名中)
var user = '${sessionScope.username}';//获取session信息 //先跨域去取主域名登录的session信息$.getJSON("www.abc.com/user/getname?callback=?",function(data){if(data != null && data != ""){//把取到的session数据设置到当前域名的session信息中 $.getJSON("www.xyz.com/user/setname?data="+data+"&callback=?",function(data){if((user == null || user == "") && data != null && data != ""){window.location.reload();//需要重新加载一下当前页面,不然头部不会显示session信息}});}else{ //退出登录时清除session信息if(user != null && user != ""){$.getJSON("www.xyz.com/user/setname?data=&callback=?",function(data){ if(data != null && data != "" && data == 'ok'){ window.location.reload(); } }); } } });
2.后台实现代码:
@RequestMapping(value="getname")@ResponseBodypublic String getName(HttpServletRequest request,HttpServletResponse response){//获取回调函数名String callback = request.getParameter("callback");String callRes = ""; try { String username = (String) request.getSession().getAttribute("username"); if(StringUtils.isBlank(username)){ return callback + "()"; } callRes = callback + "(" + JsonUtils.toJsonString(username) + ")";
} catch (Exception e) {callRes = callback + "()";logger.error(e);}return callRes;}@RequestMapping(value="setname")@ResponseBodypublic String setName(HttpServletRequest request,HttpServletResponse response){String callRes = "";//获取回调函数名String callback = request.getParameter("callback");String data = request.getParameter("data");if(StringUtils.isBlank(data)){request.getSession().invalidate();return callback + "("+JsonUtils.toJsonString("ok")+")";} try { request.getSession().setAttribute("username", data);callRes = callback + "("+JsonUtils.toJsonString("ok")+")";} catch (Exception e) {callRes = callback + "()";request.getSession().invalidate();logger.error(e);}return callRes;}
获取session数据时是否进行数据加密,这个根据自己的需要,最好是把数据加密
session已经实现了共享,这种方案的缺点就是访问测试模块的时候,需要和服务器交互很多次,性能上肯定不好
谁有更好的解决方案,请 不吝赐教,在此感谢!
转载于:https://www.cnblogs.com/gdlin/p/6846638.html
谈谈我的session跨域处理方法相关推荐
- 170222、使用Spring Session和Redis解决分布式Session跨域共享问题
使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...
- Spring Boot2.x-13前后端分离的跨域问题解决方法之Nginx
文章目录 概述 浏览器同源策略 后台搭建 pom.xml interceptor 配置 Controller 启动测试 浏览器和session 后端工程发布到服务器上 问题复现 通过Nginx反向代理 ...
- think php框架 跨域,ThinkPHP框架实现session跨域问题
这篇文章主要介绍了ThinkPHP框架实现session跨域问题的解决方法,需要的朋友可以参考下 ThinkPHP的session跨域问题很多开发者都遇到过! 其实不管是ThinkPHP还是php本身 ...
- php跨域session共享,PHP中利用COOKIE与SESSION联合实现SESSION跨域
大家都知道 在一般情况下,一个网站只有一个域名,www.demo.com,但是也有些网站架构是由多个子域名组建的.所以就需要SESSION可以跨子域被 访问到,这样才可以实现用户的跨域登录.就是说客户 ...
- 使用Spring Session和Redis解决分布式Session跨域共享问题
大家可以关注一下公众号"Java架构师秘籍" 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载 ...
- Spring Boot 2.X + Shiro 优雅解决 session 跨域问题
一.跨域问题 web 开发中跨域问题是一个老生常谈的问题,根本原因是浏览器基于安全原因考虑对非同源的脚本操作和 ajax 访问进行了限制,介绍的文章网上有很多,这里不做赘述. 二.解决方案 跨域问题有 ...
- Session跨域及单点登录解决方案
cookie机制 关于cookie和seesion的联系 cookie中会包含那些信息 名字,值,过期时间,路径,域 cookie会带到http请求头中发送给服务端 如果cookie没有设置过期时间的 ...
- 什么是跨域 解决跨域的方法 (分分钟)
一 ,为什么会出现跨域问题 处于浏览器的同原则策略(Sameoriginpolicy)是一种约定,它是浏览器最核心 也是基本的安全共功能,如果缺少了同源策略,则浏览器的正常功能可能会 收到影响.可以说 ...
- jquery、javascript实现(get、post两种方式)跨域解决方法
jquery.javascript实现(get.post两种方式)跨域解决方法 一.实现get方式跨域请求数据 浏览器端 <script> $(document).ready(fun ...
最新文章
- 从消费端到企业端,从设备到数据:物联网市场的爆发式增长
- 几个SQL命令的使用
- SQL server 数据库——T-SQL语句基础
- matlab int8 矩阵,unit8_matlab数据类型转换——int8转换成unit8
- 20分钟构建属于自己的 Linux 发行版
- 在python中如何有效的比较两个无序的列表是否包含完全同样的元素(不是set)?
- php发请求的方法,php发送http请求的几种方法
- SpringBoot项目集成Mybatis Plus(三)分页插件
- C语言之字符串探究(七):atoi、itoa——整型数字和字符串的相互转换
- 华为电脑c盘哪些文件可以删除,c盘可以删除哪些文件
- 面试官:new Object[5] 一共创建了几个对象?
- 2016-05-25 margin-right jsp获取页面流变量 文字颜色
- python网管系统_Python学员作品-网吧管理系统
- 对外汉语语料库有哪些_汉语国际教育之语料库分享
- Sql server 密钥
- 《微观经济学》第一章经济学十大原理
- Bean 工厂和Application contexts有什么区别?
- gif透明背景动画_软件|电脑GIF录制软件,强烈推荐!
- 计算机机械制图试题及答案,机械制图习题集-附带答案
- html显示vbs变量,VBS 读取 对象某属性已连接的变量的变量名