情景:公司的一个网站有一个模块(测试模块)需要单独用另外的一个域名(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")
@ResponseBody
public 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")
@ResponseBody
public 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已经实现了共享,这种方案的缺点就是访问测试模块的时候,需要和服务器交互很多次,性能上肯定不好

谁有更好的解决方案,请 不吝赐教,在此感谢!

谈谈我的session跨域处理方法的更多相关文章

  1. php SESSION跨域问题

    这段时间随着项目功能的扩展,慢慢接触到了跨域方面的知识,遇到的更多的问题也是前端与后端交互的时候跨域问题.关于js跨域的问题我会在其他分类里面写.这里记录我今天遇到的php session跨域问题 当 ...

  2. session跨域共享解决方案

    要让session跨域共享,需要解决三个问题: 1.通过什么方法来传递session_id? 2.通过什么方法来保存session信息? 3.通过什么方法来进行跨域? 一.传递session_id有4 ...

  3. thinkphp中session跨域问题

    问题描述 <thinkphp实现短信验证注册>中,小编不止记录了短信验证码的实现方法,同时还记录了图片验证码的实现方法. 本地使用,一切正常:后端项目和前端项目都部署到服务器,一切正常:后 ...

  4. 【分布式系列】session跨域及单点登录解决方案

    Cookie机制 Cookie技术是客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息. ...

  5. AJAX四种跨域处理方法

    同源策略 同源策略 同源策略限制从一个源加载的文档或者脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的关键的安全机制. 具体定义是:一段脚本向后台请求数据,只能读取属于同一协议名. ...

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

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

  7. sso单点登录的入门(Session跨域、Spring-Session共享)

    1.单点登录,就是多系统,单一位置登录,实现多系统同时登录的一种技术.单点登录一般是用于互相授信的系统,实现单一位置登录,全系统有效的. 区分与三方登录(第三方登录) ,三方登录:某系统,使用其他系统 ...

  8. java:sso(单点登录(single sign on),jsp文件动静态导入方式,session跨域)

    1.jsp文件导入: 2.session跨域: 3.sso(单点登录(single sign on): sso Maven Webapp: LoginController.java: package ...

  9. [转]vue跨域解决方法

      vue跨域解决方法 vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No 'Access-Control-Allow-Origin' hea ...

随机推荐

  1. python之数据结构链表实现方式

    #!/usr/bin/env python # --------------------------------------- # author : Geng Jie # email : gengji ...

  2. javaScript对象学习笔记(一)

    一.什么是对象 对象: JavaScript的一种基本数据类型 对象是属性的无序集合,每个属性都是一个名/值对 JavaScript中的事物都是对象:字符串.数值.数组.函数... JavaScrip ...

  3. [SinGuLaRiTy] SplayTree 伸展树

    [SinGuLaRiTy-1010]Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. Some Method Are Reprinted Fr ...

  4. 老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 4

    第七步:保存新增加日记 代码3-2-7 增加日记-保存日记 #Step7: Save the note by touch on the "save" menu entry by c ...

  5. 【Java进阶】——初识数据库连接池

    [简介] 数据库连接池:程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的链接进行申请,使用,释放. 相比之前的程序连接,减少了数据库的打开关闭次数,从而减少了程序响应的 ...

  6. DataTable源码分析(二)

    DataTable源码分析(二) ===================== DataTable函数分析 ---------------- DataTable作为整个插件的入口,完成了整个表格的数据初 ...

  7. jmeter JDBC 连接数据库

    1.添加JDBC Connection Configuration 2.添加JDBC Request 3.添加查看结果树 4. 设置下列参数:Database URL:jdbc:mysql://hos ...

  8. NDK 线程同步

    使用场景 对底层代码进行 HOOK, 不可避免的要考虑多线程同步问题, 当然也可以写个类似 java 的线程本地变量来隔离内存空间. 死锁分析 恩, 道理其实大家都懂的, 毕竟大学就学了操作系统,理论 ...

  9. Angular.js学习笔记(三)

    一.过滤器 1.uppercase,lowercase 大小写转换{{ "lower cap string" | uppercase }} // 结果:LOWER CAP STRI ...

  10. ios sqlite3的简单使用

    第一:创建表格 //创建表格 -(void)creatTab{ NSString*creatSQL=@"CREATE TABLE IF NOT EXISTS PERSIONFO(ID INT ...