情景:公司的一个网站有一个模块(测试模块)需要单独用另外的一个域名(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跨域处理方法相关推荐

  1. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  2. Spring Boot2.x-13前后端分离的跨域问题解决方法之Nginx

    文章目录 概述 浏览器同源策略 后台搭建 pom.xml interceptor 配置 Controller 启动测试 浏览器和session 后端工程发布到服务器上 问题复现 通过Nginx反向代理 ...

  3. think php框架 跨域,ThinkPHP框架实现session跨域问题

    这篇文章主要介绍了ThinkPHP框架实现session跨域问题的解决方法,需要的朋友可以参考下 ThinkPHP的session跨域问题很多开发者都遇到过! 其实不管是ThinkPHP还是php本身 ...

  4. php跨域session共享,PHP中利用COOKIE与SESSION联合实现SESSION跨域

    大家都知道 在一般情况下,一个网站只有一个域名,www.demo.com,但是也有些网站架构是由多个子域名组建的.所以就需要SESSION可以跨子域被 访问到,这样才可以实现用户的跨域登录.就是说客户 ...

  5. 使用Spring Session和Redis解决分布式Session跨域共享问题

    大家可以关注一下公众号"Java架构师秘籍" 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载 ...

  6. Spring Boot 2.X + Shiro 优雅解决 session 跨域问题

    一.跨域问题 web 开发中跨域问题是一个老生常谈的问题,根本原因是浏览器基于安全原因考虑对非同源的脚本操作和 ajax 访问进行了限制,介绍的文章网上有很多,这里不做赘述. 二.解决方案 跨域问题有 ...

  7. Session跨域及单点登录解决方案

    cookie机制 关于cookie和seesion的联系 cookie中会包含那些信息 名字,值,过期时间,路径,域 cookie会带到http请求头中发送给服务端 如果cookie没有设置过期时间的 ...

  8. 什么是跨域 解决跨域的方法 (分分钟)

    一 ,为什么会出现跨域问题 处于浏览器的同原则策略(Sameoriginpolicy)是一种约定,它是浏览器最核心 也是基本的安全共功能,如果缺少了同源策略,则浏览器的正常功能可能会 收到影响.可以说 ...

  9. jquery、javascript实现(get、post两种方式)跨域解决方法

     jquery.javascript实现(get.post两种方式)跨域解决方法 一.实现get方式跨域请求数据 浏览器端 <script> $(document).ready(fun ...

最新文章

  1. 从消费端到企业端,从设备到数据:物联网市场的爆发式增长
  2. 几个SQL命令的使用
  3. SQL server 数据库——T-SQL语句基础
  4. matlab int8 矩阵,unit8_matlab数据类型转换——int8转换成unit8
  5. 20分钟构建属于自己的 Linux 发行版
  6. 在python中如何有效的比较两个无序的列表是否包含完全同样的元素(不是set)?
  7. php发请求的方法,php发送http请求的几种方法
  8. SpringBoot项目集成Mybatis Plus(三)分页插件
  9. C语言之字符串探究(七):atoi、itoa——整型数字和字符串的相互转换
  10. 华为电脑c盘哪些文件可以删除,c盘可以删除哪些文件
  11. 面试官:new Object[5] 一共创建了几个对象?
  12. 2016-05-25 margin-right jsp获取页面流变量 文字颜色
  13. python网管系统_Python学员作品-网吧管理系统
  14. 对外汉语语料库有哪些_汉语国际教育之语料库分享
  15. Sql server 密钥
  16. 《微观经济学》第一章经济学十大原理
  17. Bean 工厂和Application contexts有什么区别?
  18. gif透明背景动画_软件|电脑GIF录制软件,强烈推荐!
  19. 计算机机械制图试题及答案,机械制图习题集-附带答案
  20. html显示vbs变量,VBS 读取 对象某属性已连接的变量的变量名

热门文章

  1. 使用HeartBeat实现高可用HA的配置过程详解
  2. 简单的企业网站后台的实现之流程
  3. asp.net中XmlDocument解析出现出错,处理特殊字符
  4. Winform中ComcoBox控件设置选定项
  5. jQuery学习(五)—课堂实训题专栏
  6. UltraEdit汇编语言高亮
  7. 社会保险的多层次包括哪些?
  8. 996工作的人,下班后还有时间锻炼身体和学习吗?还有娱乐生活吗?
  9. 5.1环绕声有什么不同
  10. 有哪些在朋友圈发会被秒赞的文案?