Cookie同域,跨域单点登录(转)

Cookie 同域单点登录

最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下)。但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录。

单点登录:多个不同系统整合到统一加载个平台,用户在任何一个系统登录后,可以访问这个统一加载上的所有系统。登录之后,用户的权限和信息不再受某个系统的限制,即使某个系统出现故障(包括统一加载平台),其他系统还是能正常使用的。这就需要用户权限等信息保存到客户端,不受服务器的限制。

在cookie相关文档信息中,提到cookie是不能跨域访问的,但是在二级域名是可以共享cookie的。这样就是我们的项目有了局限性,必须将多个系统的域名统一,作为二级域名,统一平台提供使用主域名。这样就可以实现cookie的单点登录了。

在这里介绍一下cookie:

1.cookie是一个存储在客户端的字符串属性,可以用它对当前网页的cookie进行读,写,增.删等操作;javascript能够用document对象的cookie属性对cookie进行操作;

2.cookie的四个可选属性:

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

2.2 path属性:默认情况下,在同一个目录下文件可以调用;

例如:http://hanj.com/c1/1.html设置的cookie可以被http://hanj.com/c1/2.html调用.但不能被http://hanj.com/c2/目录下的文件调用;

但如把path属性设成"/";则在http://hanj.com/下的所有文件都可调用此cookie.

2.3 domain属性:例如设成".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页面中设置P3P HTTP Header就可以解决了(具体詳細信息可以参考:http://www.w3.org/P3P/),P3P设置代码为:
/*
*也可以在html加入标记
<meta http-equiv="P3P" content=‘CP="IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA"‘>
*/
Response.AppendHeader("P3P", "CP=‘IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA‘");

时间: 2024-07-31 14:35:22

Cookie同域,跨域单点登录(转)的相关文章

[Web_Cookie]共同父域下的单点登录

单点登录(Single Sign On),简称为SSO,SSO不仅在企业级开发很常用,在互联网中更是大行其道.随便举几个例子,比如我们登录新浪微博后,再访问新浪首页后,我们发现,已经自动登录了:再比如我们登录CSDN后,可以写博客.逛论坛.下载资源等等.前者是完全跨域的单点登录,下文会讲,后者是共同父域下(www.csdn.net.blog.csdn.net.bbs.csdn.net.passport.csdn.net)的单点登录,也就是本文的主要内容.       单点登录实际上是“身份认证”

什么是跨域 &amp; 跨域的3种解决方案

所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)端口号(port) 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源. 同源策略是浏览器安全的基石 同源策略会阻止一个域的 javascript 脚本和另外一个域的内容进行交互.例如办公内外网环境,当我们访问外网一个恶意网站的时候,恶意网站就会利用我们的主机向内网的 url 发送 ajax 请求,破坏或盗取数据 一.浏览器的非同源限制以及3种解决思路 非同源限制 无

sso单点登录之跨域cookie共享 (跨域缓存共享)

使用cookie的两个属性 domain-域 通过设置这个属性可以使多个web服务器共享cookie.domain属性的默认值是创建cookie的服务器的主机名.不能将一个cookie的域设置成服务器所在的域之外的域. 举个例子: 让位于a.taotao.com的服务器能够读取b.taotao.com设置的cookie值.如果b.taotao.com的页面创建的cookie把 它的path属性设置为”/”,把domain属性设置成”.taotao.com”,那么所有位于b.taotao.com的

深入浅出让你理解跨域与SSO单点登录原理与技术

一:SSO体系结构 SSO ? SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制.它是目前比较流行的企业业务整合的解决方案之一. 体系结构 ? 当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录:根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--token:用户再访问别的应用的

JS访问或设置cookie的方法+跨域调用方法

无意中从163网站获取的JS访问或设置cookie的方法,Log到日志上以防遗忘 //COOKIE功能检查function fCheckCookie(){    if(!navigator.cookieEnabled){        alert("您好,您的浏览器设置禁止使用cookie\n请设置您的浏览器,启用cookie功能,再重新登录.");    }} //获取Cookiefunction fGetCookie(sName){   var sSearch = sName +

一份包含本地数据库验证,Windows域验证,单点登录的Spring Security配置文件

没有任何注释,表怪我(¬_¬) 在本地用户验证,Windows域验证,公司单点登录服务器测试通过 <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/bean

P3P解决cookie存取的跨域问题

最近在做一个流量统计的东西的时候,偶然发现IE在对iframe里面的页面写Cookie的时候有一些安全限制,导致读取Cookie不成功,找了好长时间的解决办法,重要找到如下的办法: 1.页面里的COOKIE不能是浏览器进程的COOKIE(包括验证票和不设置超时时间的COOKIE),否则跨域会取不到.这点做跨域COOKIE的人比较少提到.不过实际上留意下几家大学做的方案,有细微的提到他们的验证模块里的COOKIE是有设置超时时间的. 2.当利用IFRAME时,记得要在相应的动态页的页头添加一下P3

[跨域]跨域解决方法之Ngnix反向代理

跨域原理:http://www.cnblogs.com/Alear/p/8758331.html 介绍Ngnix之前,我么先来介绍下代理是什么~ 代理相当于中间人,中介的概念 代理分为正向代理和反向代理.(PS:本文介绍的解决跨域方法用的是反向代理) 正向代理:现在客户端发送一个请求给服务端,可是该客户端没有访问权限,于是只能交给一个代理服务器来转交该客户端的请求给服务端响应. 客户端知道请求资源地址,也能感知代理服务器的存在. 反向代理:客户端发送一个请求,代理服务器收到这个请求,判断到这个请

cookie跨域,跨目录访问及单点登录。

首先普及下域名的知识: 域名: baidu.com    // 一级域名  A play.baidu.com  //  二级域名 B abc.play.baidu.com // 三级域名  C 数有几个点词. 三个域名分别用A/B/C 表示. 1.1 cookie在域名下的设置:Domian 1.如果未设置Domian默认为当前网站的域名,此时只有当前域名够访问cookie; 2.Domian设置为域名域名及其子域名都可以访问.例如给A设置,A.B.C 都可以访问. cookie在域名下的删除: