asp.net关于Cookie跨域(域名)的问题
跨二级域名
我们知道cookie是可以跨二级域名来访问,这个很好理解,例如你 www.test1.com 在的web应用程序创建了一个cookie,要想在bbs.test1.com这样的二级域名对应的应用程序中访问,就必须你在创建cookie的时候设置domain参数domain=test1.com。 以asp.net为例 代码如下:
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.com
127.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。看一下前台代码,它没有任何后台代码
<%@ 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>
上一篇: Java实现二分查找算法实例分析
下一篇: 常用的wiki系统 Social.net
推荐阅读
-
asp.net关于Cookie跨域(域名)的问题
-
使用C#处理WebBrowser控件在不同域名中的跨域问题
-
关于python的bottle框架跨域请求报错问题的处理方法
-
关于python的bottle框架跨域请求报错问题的处理方法
-
fineuploader 跨子域上传文件 cookie丢失问题的解决 博客分类: JavaScript 学习vb2005xu自己动手系列 jsfineuploaderphpfile
-
fineuploader 跨子域上传文件 cookie丢失问题的解决 博客分类: JavaScript 学习vb2005xu自己动手系列 jsfineuploaderphpfile
-
关于Iframe如何跨域访问Cookie和Session的解决方法_PHP教程
-
关于 跨域传值的有关问题
-
PHP关于IE下的iframe跨域导致session丢失问题解决方法_PHP
-
ASP.net WebAPI跨域调用问题的解决方法