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加入标记

*/

Response.AppendHeader("P3P", "CP='IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA'");

jsp跨域访问cookies_cookie 跨域访问的解决方案相关推荐

  1. java angularjs 跨域访问_angularjs跨域post解决方案

    AngularJS实现跨域请求跨域,前端开发中经常遇到的问题,AngularJS实现跨域方式类似于Ajax,使用CORS机制.下面阐述一下AngularJS中使用$http实现跨域请求数据.Angul ...

  2. iframe 跨越访问_iframe跨域访问

    js跨域是个讨论很多的话题.iframe跨域访问也被研究的很透了. 一般分两种情况: 一. 是同主域下面,不同子域之间的跨域: 同主域,不同子域跨域,设置相同的document.domian就可以解决 ...

  3. ssm项目解决AJAX跨域,ssm项目跨域访问

    最近使用ssm开发了一个项目,为了项目的开发速度,采用的是前后端同时开发,所以前端文件没有集成在项目中,最后在调试时涉及到了跨域.跨域的解决方法很多,我采用的是最简单的一种,代码如下: 新建一个过滤器 ...

  4. JQuery 的跨域方法 可跨任意网站

    JS的跨域问题,很多人在网上找其解决方法,教其用IFRAME去解决的文章很多,真有那么复杂吗?其实很简单的,如果你用JQUERY,一个GETJSON方法就搞定了,而且是一行代码搞定. 下面开始贴出方法 ...

  5. php session 域,PHP session 跨子域问题总结

    今天,做项目时候遇到个问题.之前做东西的时候session一般就直接存在数据库中这样就能解决跨域 不仅仅是跨子域,但是今天遇到这个问题是,自己要在别人现有的东西上面做修改.由于仅仅是子域 当时就行肯定 ...

  6. 菜鸟教程 php跨域,PHP Ajax 跨域问题最佳解决方案

    本文通过设置Access-Control-Allow-Origin来实现跨域. 例如:客户端的域名是client.runoob.com,而请求的域名是server.runoob.com. 如果直接使用 ...

  7. html 跨域_常见跨域解决方案以及Ocelot 跨域配置

    常见跨域解决方案以及Ocelot 跨域配置 Intro 我们在使用前后端分离的模式进行开发的时候,如果前端项目和api项目不是一个域名下往往会有跨域问题.今天来介绍一下我们在Ocelot网关配置的跨域 ...

  8. php cros跨域处理,php_CORS 跨域

    通过设置Access-Control-Allow-Origin来实现跨域. 例如:客户端的域名是client.runoob.com,而请求的域名是server.runoob.com. 如果直接使用aj ...

  9. SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析

    最近在研究SSO单点登录技术,其中有一种就是通过js的跨域设置cookie来达到单点登录目的的,下面就已京东商城为例来解释下跨域设置cookie的过程 涉及的关键知识点: 1.jQuery ajax跨 ...

  10. php跨域单点登录,SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析...

    SSO单点登录技术,其中有一种就是通过js的跨域设置cookie来达到单点登录目的的,下面就已京东商城为例来解释下跨域设置cookie的过程 涉及的关键知识点: 1. 跨域redirect实例: te ...

最新文章

  1. 2020 年,让 OKR 助力你稳住 flag 清单!
  2. ecshop 整合 QQ登陆 和 支付宝快捷登陆代码
  3. 图解机房空调制冷系统
  4. 云计算机室局域网时通时断,为什么网上邻居时通时断?
  5. 拖动卡顿_四招教你解决PS软件卡顿问题!
  6. java this 三种用法
  7. 洛谷P4325、P4413题解(Java语言描述)
  8. Android九宫格闪烁,js实现九宫格点击按钮随机三个格子闪烁,发生错误
  9. CentOS系统修改IP
  10. python web框架【补充】自定义web框架
  11. IE10 CSS hack
  12. c++编程求解二元二次方程组_二元一次方程组及其解法
  13. 微信小程序使用iconfont图标
  14. 蓝桥杯青少年创意编程大赛 scratch python C++ 资料集(2022.07.08)
  15. excel制作甘特图
  16. cocos2dx3.17-lua的csb文件使用方法
  17. OpenLayers汇总目录
  18. 谈谈对springboot的理解
  19. lay-href页面不跳转
  20. JS正则表达式常见用法实例详解

热门文章

  1. Ubuntu18 mongodb 离线安装
  2. hibernate CascadeType属性说明
  3. mongo 监听指定语句
  4. 新手填坑 java.lang.Integer cannot be cast to java.lang.String
  5. pat1056. Mice and Rice (25)
  6. Snabbt.js – 极简的 JavaScript 动画库
  7. 'WebElement' object is not iterable
  8. 几个查询优化小技巧,可以大大提高效率并解决一些问题
  9. OSPF邻接关系建立过程
  10. MP(Multi-Link PPP)原理和实验