投递文章投递文章 投稿指南 RSS订阅RSS订阅

谈谈我的session跨域处理方法

来源:未知 IT堂 发布时间:2017-05-16 收藏 投稿 字体:【

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

顶一下
(0)
0%
踩一下
(0)
0%
本文Tags: session 跨域 处理方法
  • 表情:
  •    
  • 评价:
用户名: 密码: 匿名 注册
最新评论 查看所有评论
About iTtang - 联系我们  - 专题列表 - 友情链接  -  高级搜索  -  帮助中心  -  您的意见