SSO 跨域名(两个截然不同的域名共用一个 cookie )

有时在编代码的时候,累并不是一件坏事,当你累时,你应该出去空气流通的地方放松一下自己的心情。这样说不定会突然茅塞顿开。
研究了一个礼拜 Cookie 跨域问题 ,今天终于解决了,其用这么久解决的原因是:懒得去动,只是思考,所以 希望看到这篇文章的朋友们 一定要 多思考,勤动手。失败就是在快成功的时候没能再坚持一点点。
下来进入正题:我负责的服务器的的域名是: http://uc.cun365.com
计划要跨域共享 cookie 的另一台服务器的域名是: http://www.c365.com
分析:所谓人们常用的 cookie 跨域是说: uc.cun365.com 下登录,凡是后缀名为:.cun365.com 的服务器都可共享同一个 cookie, 这种方式相对比较容易解决,只要设置一下 setDomain(".cun365.com") 就行。但是问题来了,如果要跨另一台服务器的话,我们应该怎么办呢?
解决:再次使用上面那种方法 setDomain(".c365.com") 已经是不可能实现,因为它两使用的服务器不是同一个,而且也不是 二级域名的关系,所以目前有两种方法解决遇到的这种问题。
方法1
步骤(1):创建 jsp 页面 ,名字为: login4cun.jsp

<%@ page language="java" pageEncoding="GBK"%>

测试 在 村网 登录 后 隐士在 生活网 登录
<%
String token = request.getParameter("token");
String passport = request.getParameter("passport");
if(null != token && null!=passport){
response.setHeader("P3P","CP=\"NON DSP COR CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa CONa HISa TELa OTPa OUR UNRa IND UNI COM NAV INT DEM CNT PRE LOC\"");

session.setAttribute("cnlifeUserToken", token);
session.setAttribute("cnlifeUserId", passport);

Cookie aCookie = new Cookie("cnlifeUserToken", token);
aCookie.setMaxAge(-1);
aCookie.setDomain(".c365.com");
aCookie.setPath("/");
response.addCookie(aCookie);

passport = new String(passport.getBytes("GBK"), "ISO8859_1");
aCookie = new Cookie("cnlifeUserId",passport);

aCookie.setMaxAge(-1);
aCookie.setDomain(".c365.com");
aCookie.setPath("/");
response.addCookie(aCookie);
}
%>

[color=red]注意:[/color][color=red]创建好后一定要放在 域名为 :http:www.c365.com 服务器上,我就是因为不相信这种做法,害的走了4天弯路。[/color]

步骤(2):再创建一个 jsp 页面,名字为: test.jsp

<%@ page language="java" pageEncoding="GBK"%>
<script type="text/javascript" src="http://www.c365.com/header1215/login4cun.jsp?token=aea1a0b549703a2060142b93ecc2846c&passport=renweigang">
</script>

测试 在 村网 登录 后 隐士在 生活网 登录
<%@ page language="java" pageEncoding="GBK"%>
<script type="text/javascript" src="http://www.c365.com/header1215/login4cun.jsp?token=aea1a0b549703a2060142b93ecc2846c&passport=renweigang">
</script>

测试 在 村网 登录 后 隐士在 生活网 登录
<a href="http://www.c365.com/ssoserver/logout.jsp?backurl=http://www.rwg.com:8080/ucenter/themes/default/logout.jsp">注销</a>


[color=red]注意:以上的参数: token:是 辨别用户的令牌,你可以自己写一个,思路是:先验证用户名与密码是否匹配,如果匹配则 自动生成 一个 有效 的证书(16位的随机数).
passport :为 用户登录名,一定不要是中文,否则会出现 exceptin,因为它是往cookie 中保存,而cookie 的值是不支持 中文的,如果是中文 则把它转为: iso-8859-1即可。[/color]

步骤(3):在火狐浏览器中 测试: http://localhost:8080/ucenter/test.jsp ,然后看看 域名为 .c365.com 的值是不是添加进来了。
[color=red]注意: 最好在火狐下测试,因为显示的比较直观。[/color]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当用户第一次访问web应用系统1的时候,因为还没有登录,会被引导到认证中心进行登录;根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,返回给用户一个认证的凭据;用户再访问别的web应用的时候就会将这个Token带上,作为自己认证的凭据,应用系统接受到请求之后会把Token送到认证中心进行效验,检查Token的合法性。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。所有应用系统共享一个身份认证系统。认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志,返还给用户。另外,认证系统还应该对Token进行效验,判断其有效性。 所有应用系统能够识别和提取Token信息要实现SSO的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对Token进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。 比如说,我现在有3个分站点和1个认证中心(总站)。当用户访问分站点的时候,分站点会发Token到验证中心进行验证。验证中心判断用户是否已经登录。如果未登录,则返回到验证中心登录入口进行登录,否之则返回Token验证到分站点,直接进入分站点
SSO (Single Sign-On) 单点登录是指在访问多个系统或应用程序时,用户只需登录一次就可以访问所有的系统,而无需再次输入用户和密码。基于cookie二级域名跨域共享是指在跨域访问的情况下,通过设置cookie域名和路径,使得不同域名下的系统能够共享登录状态。 具体来说,当用户成功登录一个系统后,该系统会生成一个包含用户登录状态的cookie,并设置该cookie域名为当前系统的二级域名。然后,该cookie会被发送给浏览器保存,在用户访问其他系统时,浏览器会自动通过cookie将用户的登录状态传递给其他系统。 为了实现跨域共享,所有需要实现SSO的系统的二级域名需要设置为相同的根域名。例如,系统A的域名为a.example.com,系统B的域名为b.example.com,则它们的根域名为example.com。为了在这两个系统之间实现跨域共享,可以将cookie域名设置为.example.com,这样两个系统就可以共享同一个cookie。 当用户访问系统A时,系统A会检查是否存在含有登录状态的cookie,如果存在则表示用户已经登录,可以直接访问系统A的资源。如果用户访问系统B,系统B也会检查是否存在含有登录状态的cookie,如果存在则表示用户已经登录,可以直接访问系统B的资源。 通过基于cookie二级域名跨域共享的方式,SSO单点登录实现了用户在不同系统间的无缝登录体验,提高了用户的使用便捷性和系统的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值