情景:公司的一个网站有一个模块(测试模块)需要单独用另外的一个域名(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. 20155206 2016-2017-2 《Java程序设计》第5周学习总结

    20155206 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 Java中所有错误都会被打包为对象,运用try.catch,可以在错误发生时显示友好的错误信 ...

  2. 模式识别(1)——PCA算法

    作者:桂. 时间:2017-02-26  19:54:26 链接:http://www.cnblogs.com/xingshansi/articles/6445625.html 声明:转载请注明出处, ...

  3. 老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer

    老李推荐:第14章6节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-启动ViewServer   poptest是国内唯一一家培养 ...

  4. Fragment深入解析

    写在顶部表示这点很重要:  本文转载自博客:http://blog.csdn.net/lmj623565791/article/details/37970961   欢迎访问原文 自从Fragment ...

  5. vuejs学习笔记(2)--属性,事件绑定,ajax

    属性 v-for 类似于angular中的 ng-repeat ,用于重复生成html片段: <ul id="box"> <li v-for="(v, ...

  6. 抽象工厂模式(Abstract Factory)

    (二)抽象工厂模式(Abstract Factory) 1.抽象工厂模式(Abstract Factory),提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 2.抽象工厂模式是 ...

  7. .elf格式内容

    arm-linux-ld 可以将程序链接成我们arm平台下的可运行的程序 以之前使用过的led程序为例: 首先: arm-linux-gcc -g -c led.S (-g是表示产生调试信息, -c是 ...

  8. jquery template.js前端模板引擎

    作为现代应用,ajax的大量使用,使得前端工程师们日常的开发少不了拼装模板,渲染模板 在刚有web的时候,前端与后端的交互,非常直白,浏览器端发出URL,后端返回一张拼好了的HTML串.浏览器对其进行 ...

  9. angularjs实现首页轮播图

    <!DOCTYPE html> <html ng-app="myApp" lang="en"> <head> <met ...

  10. ios 检测屏幕方向

    方法一:通知中心监听 name: // UIDeviceOrientationDidChangeNotification   允许方向改变的情况下,监听设备方向,与电池条无关 // UIApplica ...