博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Cookie跨域的问题研究
阅读量:7250 次
发布时间:2019-06-29

本文共 4267 字,大约阅读时间需要 14 分钟。

  Cookie是一个伟大的发明,它允许保留他们的用户的登录状态。但是当你的站点有一个以上的域名时就会出现问题了。在Cookie规范上说,一个cookie只能用于一个域名,不能够发给其它的域名。因此,如果在浏览器中对一个域名设置了一个cookie,这个cookie对于其它的域名将无效。如果你想让你的用户从你的站点中的其中一个进行登录,同时也可以在其它域名上进行登录,这可真是一个大难题。

跨二级域名

  我们知道cookie是可以跨二级域名来访问,这个很好理解,例如你 www.test1.com 在的web应用程序创建了一个cookie,要想在bbs.test1.com这样的二级域名对应的应用程序中访问,就必须你在创建cookie的时候设置domain参数domain=test1.com。 以asp.net为例 代码如下:

1
2
3
4
HttpCookie cookie =
new
HttpCookie(
"name"
,
"www.Admin10000.com"
);
cookie.Domain =
"test1.com"
;
cookie.Path =
"/"
;
Response.Cookies.Add(cookie);

跨顶级域名

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

  我们来做个测试,看看两个站点 www.test1.com 和 www.test2.com 如何实现cookie跨域访问。 按照常规我们需要有2个顶级域名,并且有DNS服务器才能够配置域名,否则我们是无法验证的,但是这里我们也没有必要那么麻烦,我们可以通过修改hosts文件来模拟。在 c:\windows\system32\drivers\etc 中有 hosts文件,在末尾添加上

127.0.0.1    www.test1.com127.0.0.1    www.test2.com

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Admin10000.Web.Default" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">
<
html
xmlns
=
""
>
<
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 = "";
            
document.body.appendChild(_frm);  
        
</
script
>
 
    
</
div
>
    
</
form
>
</
body
>
</
html
>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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 =
""
)]
    
[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下的页面,没有前台代码,只有后台代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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下是可以访问到的。

要注意的地方:

  提示 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调用形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Admin10000.Web.Default" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">
 
<
html
xmlns
=
""
>
<
head
runat
=
"server"
>
    
<
title
></
title
>
</
head
>
<
body
>
    
<
form
id
=
"form1"
runat
=
"server"
>
    
<
div
>
        
<
script
type
=
"text/javascript"
src
=
""
></
script
>
    
</
div
>
    
</
form
>
</
body
>
</
html
>

转载于:https://www.cnblogs.com/ranran/p/3580336.html

你可能感兴趣的文章
在 Cent OS 6.5 中安装桌面环境
查看>>
liquibase判断mysql表字段是否存在
查看>>
透彻理解VLAN技术
查看>>
linux-Centos 7下bond与vlan技术的结合
查看>>
sqoop2安装配置
查看>>
ulimit调优|设置普通用户的ulimit值
查看>>
AGG第九课 agg::rendering_buffer 渲染缓存
查看>>
mysql5.6 的--dump-slave参数的用法
查看>>
rsync同步的实现及其简单源码包的编译安装
查看>>
AGG第三十八课 一些不常用的坐标转换管道
查看>>
实战案例:创建支持SSH服务的镜像
查看>>
Fiddler Web Debugger简单调试头部参数
查看>>
Linux环境下发布项目(Tomcat重新启动)
查看>>
centos7配置svn服务器
查看>>
亮剑:PHP,我的未来不是梦(13)
查看>>
MYSQL主从数据同步
查看>>
javascript数组操作
查看>>
linux中父进程退出时如何通知子进程
查看>>
linux 缩减文件系统大小 LVM
查看>>
对比文件md5值实现去重文件
查看>>