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

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

  • 相关阅读:
    June. 26th 2018, Week 26th. Tuesday
    June. 25th 2018, Week 26th. Monday
    June. 24th 2018, Week 26th. Sunday
    June. 23rd 2018, Week 25th. Saturday
    June. 22 2018, Week 25th. Friday
    June. 21 2018, Week 25th. Thursday
    June. 20 2018, Week 25th. Wednesday
    【2018.10.11 C与C++基础】C Preprocessor的功能及缺陷(草稿)
    June.19 2018, Week 25th Tuesday
    June 18. 2018, Week 25th. Monday
  • 原文地址:https://www.cnblogs.com/gdlin/p/6846638.html
Copyright © 2011-2022 走看看