cookie怎么跨顶级域名啊?

JavaScript014

cookie怎么跨顶级域名啊?,第1张

跨顶级域名

如果不是二级域名而是完全在不同顶级域名中,所在的web应用程序创建了一个cookie,想要在 其二级域名的应用程序中访问,知道靠常规反的方法是访问不了的,关键就是看看有没有方法可以访问。事实是Cookie可以在一定条件下跨域,而不是随心所欲的实现跨域。

按照常规我们需要有2个顶级域名,并且有DNS服务器才能够配置域名,否则我们是无法验证的,但是这里没有必要那么麻烦,可以通过修改hosts文件来模拟。在 c:\windows\system32\drivers\etc 中有 hosts文件,在末尾添加上

127.0.0.1

127.0.0.1

两行,就可以将本机用上面的域名访问本机回环地址了。只需要在IIS上部署一套程序,ip为本机回环地址,用两个域名分别访问就可以了。

新建三个页面,分别是 Default.aspx、SSO.ashx、GetCookie.aspx。

其中Default.aspx是 www.test1.com 的页面,访问的地址是 http://www.test1.com/Default.aspx。看一下前台代码,它没有任何后台代码

复制代码代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Admin10000.Web.Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<title></title>

</head>

<body>

<form id="form1" runat="server">

<div>

<script type="text/javascript">

var _frm = document.createElement("iframe")

_frm.style.display = "none"

_frm.src = "http://www.test2.com/SSO.ashx"

document.body.appendChild(_frm)

</script>

</div>

</form>

</body>

</html>

另外一个是 SSO.ashx 页面,我们认为它是 www.test2.com 的页面,前台没有任何代码,后台代码如下:

复制代码代码如下:

using System

using System.Collections.Generic

using System.Linq

using System.Web

using System.Web.Services

using System.Web.SessionState

namespace Admin10000.Web

{

/// <summary>

/// $codebehindclassname$ 的摘要说明

/// </summary>

[WebService(Namespace = "http://tempuri.org/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class SSO : IHttpHandler

{

public void ProcessRequest(HttpContext context)

{

HttpCookie cookie = new HttpCookie("name", "www.Admin10000.com")

cookie.Domain = "test2.com"

cookie.Path = "/"

cookie.Expires = DateTime.Now.AddMinutes(10000)

context.Response.Cookies.Add(cookie)

context.Response.ContentType = "text/plain"

context.Response.AddHeader("P3P", "CP=CAO PSA OUR")

context.Response.Write("")

}

public bool IsReusable

{

get

{

return false

}

}

}

}

最后是 GetCookie.aspx 页面,它同样是www.test2.com下的页面,没有前台代码,只有后台代码:

复制代码代码如下:

using System

using System.Collections.Generic

using System.Linq

using System.Web

using System.Web.UI

using System.Web.UI.WebControls

namespace Admin10000.Web

{

public partial class GetCookie : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

if (Request.Cookies["name"] != null)

{

Response.Write(Request.Cookies["name"].Value)

}

}

}

}

好了,现在访问测试,通过访问 http://www.test1.com/Default.aspx 之后,这时会通过iframe载入调用SSO.ashx这个页面,执行后台代码创建cookie,然后访问 http://www.test2.com/GetCookie.aspx 得到了相应的cookie。说明在www.test1.com下创建的cookie在www.test2.com下是可以访问到的。

要注意的地方:

admin10000.com 提示 SSO.ashx 的后台代码中有一句:context.Response.AddHeader("P3P", "CP=CAO PSA OUR")是用来设置P3P响应头。是因为IE浏览器支持的P3P导致iframe跨站点时cookie被阻止,无法创建cookie。(FireFox目前还不支持P3P安全特性,FireFox自然也不存在此问题。不需要添加P3P响应头。)

通过iframe的src属性将test1.com域下的cookie值作为get参数重定向到test2.com域下SSO.ashx页面上,SSO.ashx获取test1.com域中所传过来的cookie值,并将所获取到值写入cookie中,这样就简单的实现了cookie跨域的访问。

另外Default.aspx页面也可改为JS调用形式:

复制代码代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Admin10000.Web.Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title></title>

</head>

<body>

<form id="form1" runat="server">

<div>

<script type="text/javascript" src="http://www.test2.com/SSO.ashx"></script>

</div>

</form>

</body>

</html>

前后端分离,最应该用token来交互,而不是用cookie。当然是可以取得cookie的。所有的cookie 都在头里面,有个Set-Cookie的字段,读取这个头就可以了。

Token是令牌。HTTP是无状态的,Cookie是记录HTTP状态的一种手段。浏览器会通过Set-Cookie字段获取Cookie。而Token是通过oauth认证后得到的令牌。