asp.net关于Cookie跨域(域名)的问题
跨二级域名
我们知道cookie是可以跨二级域名来访问,这个很好理解,例如你 .test1. 在的web应用程序创建了一个cookie,要想在bbs.test1.这样的二级域名对应的应用程序中访问,就必须你在创建cookie的时候设置domain参数domain=test1.。 以asp.为例 代码如下
HttpCookie cookie = new HttpCookie("name", ".Admin10000.");
cookie.Domain = "test1.";
cookie.Path = "/";
Response.Cookies.Add(cookie);
跨顶级域名
如果我不是二级域名而是完全在不同顶级域名中,例如 .test1. 所在的web应用程序创建了一个cookie,想要在 .test2. 或其二级域名的应用程序中访问,改怎么办呢?我们知道靠常规反的方法是访问不了的,关键我们就是看看有没有方法可以访问。事实是Cookie可以在一定条件下跨域,而不是随心所欲的实现跨域。
我们来做个测试,看看两个站点 .test1. 和 .test2. 如何实现cookie跨域访问。 按照常规我们需要有2个顶级域名,并且有DNS服务器才能够配置域名,否则我们是无法验证的,这里我们也没有必要那么麻烦,我们可以通过修改hosts文件来模拟。在 c:\windows\system32\drivers\etc 中有 hosts文件,在末尾添加上
127.0.0.1 .test1.
127.0.0.1 .test2.
两行,就可以将本机用上面的域名访问本机回环地址了。我们只需要在IIS上部署一套程序,ip为本机回环地址,用两个域名分别访问就可以了。
我们新建三个页面,分别是 Default.aspx、SSO.ashx、GetCookie.aspx。
其中Default.aspx是 .test1. 的页面,访问的地址是 http://.test1./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://.w3./TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://.w3./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://.test2./SSO.ashx";
document.body.appendChild(_frm);
</script>
</div>
</form>
</body>
</html>
一个是 SSO.ashx 页面,我们认为它是 .test2. 的页面,前台没有任何代码,后台代码如下
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./")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class SSO : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
HttpCookie cookie = new HttpCookie("name", ".Admin10000.");
cookie.Domain = "test2.";
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 页面,它同样是.test2.下的页面,没有前台代码,只有后台代码
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://.test1./Default.aspx 之后,这时会通过iframe载入调用SSO.ashx这个页面,执行后台代码创建cookie,然后访问 http://.test2./GetCookie.aspx 我们得到了相应的cookie。说明在.test1.下创建的cookie在.test2.下是可以访问到的。
要注意的地方
admin10000. 提示 SSO.ashx 的后台代码中有一句context.Response.AddHeader("P3P", "CP=CAO PSA OUR"); 是用来设置P3P响应头。是因为IE浏览器支持的P3P导致iframe跨站点时cookie被阻止,无法创建cookie。(FireFox目前还不支持P3P安全特性,FireFox自然也不存在此问题。不需要添加P3P响应头。)
通过iframe的src属性将test1.域下的cookie值作为get参数重定向到test2.域下SSO.ashx页面上,SSO.ashx获取test1.域中所传过来的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://.w3./TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://.w3./1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<script type="text/javascript" src="http://.test2./SSO.ashx"></script>
</div>
</form>
</body>
</html>
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程