• 谈谈我的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")
        @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已经实现了共享,这种方案的缺点就是访问测试模块的时候,需要和服务器交互很多次,性能上肯定不好

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

  • 相关阅读:
    第七课——iOS数据持久化
    第三章-动态规划
    IOS第五课——Gesture and TableView
    第六课——UIDynamicAnimator
    文本居中换行、边框设置
    属性优先级、图片属性设置、内联标签设置大小
    打开、悬浮、访问、点击、状态用:
    属性选择器用【】
    组合使用用逗号,
    3种选择器的使用方式
  • 原文地址:https://www.cnblogs.com/gdlin/p/6846638.html
Copyright © 2020-2023  润新知