cookie 跨域访问的解决方案

摘要:
Cookie同域单点登录最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录。在cookie相关文档信息中,提到cookie是不能跨域访问的,但是在二级域名是可以共享cookie的。这样就可以实现cookie的单点登录了。在addSSOCookie方法中,没有设置cookie的失效时间,这样在浏览器关闭后,cookie就自动消失。但这样安全性不能保证,如果时间设置太短,用户在使用中,可能cookie就失效了,需要重新登录。cookie不能准确的删除,存在安全隐患。
Cookie同域单点登录

最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下)。但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录。
单点登录:多个不同系统整合到统一加载个平台,用户在任何一个系统登录后,可以访问这个统一加载上的所有系统。登录之后,用户的权限和信息不再受某个系统的限制,即使某个系统出现故障(包括统一加载平台),其他系统还是能正常使用的。这就需要用户权限等信息保存到客户端,不受服务器的限制。

在cookie相关文档信息中,提到cookie是不能跨域访问的,但是在二级域名是可以共享cookie的。这样就是我们的项目有了局限性,必须将多个系统的域名统一,作为二级域名,统一平台提供使用主域名。这样就可以实现cookie的单点登录了。
在这里介绍一下cookie:
1.cookie是一个存储在客户端的字符串属性,可以用它对当前网页的cookie进行读,写,增.删等操作;javascript能够用document对象的cookie属性对cookie进行操作;

2.cookie的四个可选属性:

2.1cookie的生存期属性:expires;默认情况下,cookie只在浏览器会话期存在.退出浏览器就丢失;可以用expires设置时间;退出浏览器后就不会丢失并存为客户端浏览器的cookie文件;过了时间后cookie失效,还会自动删除cookie文件.

2.2path属性:默认情况下,在同一个目录下文件可以调用;
例如:http://hanj.com/c1/1.html设置的cookie可以被http://hanj.com/c1/2.html调用.但不能被http://hanj.com/c2/目录下的文件调用;
但如把path属性设成"/";则在http://hanj.com/下的所有文件都可调用此cookie.
2.3domain属性:例如设成".hanj.com"则在.hanj.com下的所有服务器下的文件都可以调用cookie.
2.4安全属性:默认情况下为false;用http协议不安全传输;true:用https等协议安全传输.
3.cookie的局限性:
浏览器最多保存300个cookie;为单个web服务器的最多只能保存20个cookie;每个cookie不能超过4000个字节.
单点登录实现环境:

统一平台域名:www.hanj.com
子系统1:a.hanj.com
子系统2:b.hanj.com
子系统3:c.hanj.com
统一加载平台和各子系统都是不同的服务器,统一加载平台提供登录认证服务,在统一加载平台认证系统上登录后,用户都可以被其他的系统识别。
/**
函数名称:getCookie
函数功能:获取指定名称的cookie的值
输入参数:需要测试的字符串
返回参数:
*/

function getSSOCookie()  
{  
    var arrStr = document.cookie.split("; ");  
    for(var i = 0;i < arrStr.length;i ++){  
        var temp = arrStr[i].split("=");  
        if(temp[0] == "sso") {  
          return unescape(temp[1]);  
        }  
    }  
    return "";  
}  


/**
函数名称:addCookie
函数功能:添加cookie
输入参数:需要测试的字符串
返回参数:
*/
function addSSOCookie(objValue)  
{ 
    var str = "sso" + "=" + escape(objValue);  
    if(true){//为0时不设定过期时间,浏览器关闭时cookie自动消失  
        str += "; path=/";  
    }  
    document.cookie = str;  
}  
 

/**
函数名称:delCookie
函数功能:删除cookie
输入参数:需要测试的字符串
返回参数:
*/

function delCookie() {
//为了删除指定名称的cookie,可以将其过期时间设定为一个过去的时间 var date = new Date(); date.setTime(date.getTime() - 10000); document.cookie = "sso" + "=a; expires=" + date.toGMTString()+"; path=/"; }

用户在统一加载平台认证系统认证通过后,使用addSSOCookie,用户权限信息保存到了cookie中,其他平台通过调用getSSOCookie,取得用户信息。这样用户就可以不再受平台限制,而实现自由访问各个系统了。
在addSSOCookie方法中,没有设置cookie的失效时间,这样在浏览器关闭后,cookie就自动消失。注意:这样cookie的有效性只能在同一浏览器进程,如果重新打开了一个浏览器进程,cookie信息是获取不到的,也就是单点登录只能在同一个浏览器进程有效。如果想在不用浏览器进程中共享cookie信息,那就设置失效时间,如下:
function addCookie(objValue,objHours){//添加cookie  
  var str = "sso"+ "=" + escape(objValue);  
  if(objHours > 0){//为0时不设定过期时间,浏览器关闭时cookie自动消失  
  var date = new Date();  
  var ms = objHours*3600*1000;  
  date.setTime(date.getTime() + ms);  
  str += "; expires=" + date.toGMTString()+"; path=/; domain=.hanj.com";  
  }  
  document.cookie = str;  
}  
这样cookie在指定的时间后失效。但这样安全性不能保证,如果时间设置太短,用户在使用中,可能cookie就失效了,需要重新登录。如果时间过长,用户在下次访问,或电脑重起访问,cookie还在有效期中,有可能别其他人使用。cookie不能准确的删除,存在安全隐患。
Cookie跨域单点登录
为了快速、简单的实现这一功能,首先想到就是通过JS操作Cookie并让两个不同域的cookie能够相互访问,这样就可达到了上述的效果,具体实现过程大致可分以下两个步骤:
1、在A系统下成功登录后,利用JS动态创建一个隐藏的iframe,通过iframe的src属性将A域下的cookie值作为 get参数重定向到B系统下b.aspx页面上;
var _frm = document.createElement("iframe");  
_frm.style.display="none";   
_frm.src="http://b.com/b.jsp?test_cookie=xxxxx";   
document.body.appendChild(_frm);   

2、在B系统的b.aspx页面中来获取A系统中所传过来的cookie值,并将所获取到值写入cookie中,这样就简单的实现了cookie跨域的访问; 不过这其中有个问题需要注意,就是在IE浏览器下这样操作不能成功,需要在b.aspx页面中设置P3PHTTPHeader就可以解决了(具体詳細信息可以参考:http://www.w3.org/P3P/),P3P设置代码为:
/*
*也可以在html加入标记
<metahttp-equiv="P3P"content='CP="IDCDSPCORCURaADMaOURINDPHYONLCOMSTA"'>
*/
Response.AppendHeader("P3P", "CP='IDC DSP COR CURa ADMa  OUR IND PHY ONL COM STA'");  

免责声明:文章转载自《cookie 跨域访问的解决方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇无线电频段的划分关于Delphi内存表的使用说明下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Cookie详解

摘要:cookie是一个文本信息,不是程序。它是网站用来存储用户信息的工具。每个网站都有自己的cookie,必可互通。一个网站可以有多个cookie,每个cookie含有一个值。 例如,百度首页 Cookie 提供了一种在 Web 应用程序中存储用户特定信息的方法。例如,当用户访问您的站点时,您可以使用 Cookie 存储用户首选项或其他信息。...

express中间件

中间件(Middleware)可以理解为一个对用户请求进行过滤和预处理的东西,它一般不会直接对客户端进行响应,而是将处理之后的结果传递下去。 Express支持的中间件在express官网中可以看出express本身支持若干中间件: basicAuth:基本的身份认证功能,处理之后可以通过req.user属性访问被认证的用户对象 bodyParser:完...

JS window.open()属性

一. Window 对象 Window 对象是 JavaScript 层级中的顶层对象。 Window 对象代表一个浏览器窗体或一个框架。 Window 对象会在 <body> 或 <frameset> 每次出现时被自己主动创建。 二. open() 方法用于打开一个新的浏览器窗体或查找一个已命名的窗体。 三. window.op...

2020前端面试题常问集锦

以下为常备面试题集锦,面好多家公司大都问的如此(后续更新补);还有一些算法和手写代码后面整理; js陈述类型1、Es6的class和构造函数的区别: class xx { }(1)不存在变量提升(2)方法默认是不可枚举的,class所有方法没有原型对象prototype也没有构造器不能用new来调用; 2、普通函数和箭头函数的区别?(1)this指向不...

软件测试_Fiddler抓包工具一

多数资料摘抄至https://www.cnblogs.com/miantest/p/7289694.html 一、在 macOS 下如何安装 (https://www.telerik.com/fiddler) 首先,Mac下需要使用.Net编译后的程序,需要用到跨平台的方案Mono(现阶段微软已推出跨平台的方案.Net Core,不过暂时只支持控制台程序)...

Springboot+post请求接口

本文是Springboot+post请求接口的生成,包含了带cookie 和参数发送post请求。新增lombok框架,lombok的使用可以不用在类中添加成员变量的get/set方法。框架自带了相关方法。如不需要再添加以下内容 public String getUsename() { return usename; } p...