被误解的HttpCookie.Domain属性

有人说可以利用HttpCookie.Domain属性实现跨域访问,假如在A站(A.com)中写B站(B.com)的cookie,如下所示

这其实是错误的,运行后通过浏览器查看,并没有成功写入B站的cookie(读取也是一样失败,由于浏览器的隐私策略限制,禁止读取非本域的cookie).

所以这个Domain属性,应该是可以跨子域,例如x.A.com和y.A.com,通过设置HttpCookie.Domain=“.A.com”,实现跨子域访问。

//A站a_setCookie.aspx (www.a.com)
HttpCookie cookie = new HttpCookie("key");
cookie.Value = key;
cookie.Domain = ".b.com";//这里指定的是B站
cookie.Path = "/";
cookie.Expires = DateTime.Now.AddHours();
filterContext.RequestContext.HttpContext.Response.Cookies.Add(cookie);

既然cookie无法跨域共享,那如何实现跨域访问呢?

可以利用script标签间接调用B站的页面,实现写入B站cookie的目的。

步骤一:先在B站(b_setCookie.aspx)下设置cookie的方法:

HttpCookie cookie = new HttpCookie("key");
cookie.Value = key;
cookie.Domain = ".b.com";//这里指定的是B站
cookie.Path = "/";
cookie.Expires = DateTime.Now.AddHours(1);
Response.Cookies.Add(cookie);
 

步骤二:由于<script>标签可以自动访问第三方网站,因此可以在A站的页面,例如a_setCookie.aspx的页面<head>标签内下设置如下:

<head><script src="http://www.b.com/b_setCookie.aspx" /></head>

以上步骤完毕,当访问A站的a_setCookie.aspx时,就会自动访问http://www.b.com/b_setCookie.aspx,实现写入B站cookie的目的。

测试B站cookie是否设置成功,B站下新建页面b_getCookie.aspx,读取B站的cookie

var key=Request.cookie["key"];
//或者
key=Request["key"];

注意:访问b_getCookie.aspx前,先访问A站的a_setCookie.aspx

注意浏览器的第三方 cookie 限制

所谓第三方 cookie,就是说你访问域名 A的一个页面,却接收到域名 B 的 cookie 设定指令。那么B就属于第三方,不同浏览器对于第三方cookie的限制有些区别,如下表

不同浏览器的第三方 cookie 规则
  IE FIREFOX CHROME SAFARI OPERA
限制第三方coookie

使用p3p跨域设置Cookie

p3p((Platform for Privacy Preferences))介绍

http://baike.baidu.com/link?url=WVQp0aTUQgCoIzYm7rV_mur829NtWZCiSq9Kee_WusqmOWOQDwS2DNzw_S5M6UM-EcvNCliBHvYAV4kEjRBip_

为了消除这个限制,可以在b_setCookie.aspx加上如下设置

Response.Headers.Add("P3P", "CP=/"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR/"");

 

Cookie的跨域问题的更多相关文章

  1. 携带cookie的跨域访问

    携带cookie的跨域解决方案 有的时候访问后台的请求需要携带cookie以供后台分析,比如jQuery的ajax请求: $.ajax({ url: a_cross_domain_url, xhrFi ...

  2. [php-cookie] cookie 请求跨域,如何共享

    cookie 请求跨域的问题, 假设我有两个域名,一个 m.example.com,另一个是 www.example.com . 那么我需要如何设置 cookie 才可以在这两个域名都实现共享呢? / ...

  3. localStorage和cookie的跨域解决方案

    原文转自:点我 前言 localStorage和cookie大家都用过,我前面也有文章介绍过,跨域大家也都了解,我前面也有文章详细描述过.但是localStorage和cookie的跨域问题,好多小伙 ...

  4. cookie解决跨域问题

    v一.前言 随着项目模块越来越多,很多模块现在都是独立部署.模块之间的交流有时可能会通过cookie来完成.比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入 ...

  5. cookie用法小结 cookie.setPath 跨域共享

    1. JSP中Cookie的读写 Cookie的本质是一个键值对,当浏览器访问web服务器的时候写入在客户端机器上,里面记录一些信息.Cookie还有一些附加信息,比如域名.有效时间.注释等等. 下面 ...

  6. 跨域共享cookie和跨域共享session

    转载自:http://blog.csdn.net/ahhsxy/article/details/7356128 这里所说的跨域,是指跨二级域名,而且这些域名对应的应用都在同一个app上, 比如我有以下 ...

  7. 后端设置Cookie前端跨域获取丢失问题(基于springboot实现)

    1.跨域问题说明:后端域名为A.abc.com,前端域名为B.abc.com. 2.后端设置一个cookie发送给前台,domain应该是setDomain(“abc.com”),而不是setDoma ...

  8. Ajax跨域请求附带Cookie/Ajax跨域请求附带身份凭证

    一.跨域请求中默认不带cookie等验证凭证 尤其对于post请求. 对于ajax请求,其中post,get都可以正常访问. withCredentials: false, // 允许携带cookie ...

  9. 使用Cookie实现跨域单点登录的原理

    对于构建分布式系统来说业务功能的物理部署会随着新业务模块的增加而增加或改变物理部署的位置.而每个用户都有统一的帐号作为我们登录系统时的一个认证.当新业务或子系统部署在不同的物理机上,我们去访问不同的业 ...

随机推荐

  1. kafka ksql && docker 安装试用

    备注: 使用docker 模式进行安装   1. 准备docker 环境(需要docker-compose)      docker 的安装不需要进行多描述了,直接yum 或者源码编译也可以     ...

  2. 泛型List<T>排序(利用反射)

    在最近一个项目中,有需求要对页面中所有的gridview添加排序功能.由于gridview的数据源绑定的是一个集合类List,而不是DataTable,所以无法使用DataView排序功能.另外,不同 ...

  3. FastAdmin Bootstrap-Table 分页列表 pageList 如何设置?

    FastAdmin Bootstrap-Table 分页列表 pageList 如何设置? FastAdmin 的 表格使用的是 Bootstrap-Table 组件,这个组件该有的功能他都有. 默认 ...

  4. 自动工作负载库理论与操作(Automatic Workload Repository,AWR)

    AWR的由来:    10g之前的oracle:用户的连接将产生会话,当前会话记录保存在v$session中:处于等待状态的会话会被复制一份放在v$session_wait中.当该连接 断开后,其原来 ...

  5. 理解Windows消息循环机制

    理解消息循环和整个消息传送机制对Windows编程十分重要.如果对消息处理的整个过程不了解,在windows编程中会遇到很多令人困惑的地方. 什么是消息(Message)每个消息是一个整型数值,如果查 ...

  6. ALUA and SRM

    A couple important (ALUA and SRM) notes There’s some internal dialog today on our “VMware Champions” ...

  7. NGINX通过Stream转发ftp请求

    一.NGINX 1.9之前,需要安装第三方的TCP插件: http://www.cnblogs.com/i-blog/p/6165378.html 二.1.9之后直接使用Stream配置就可以了,当然 ...

  8. tomcat 1字节的UTF-8序列的字节1无效

    微信支付时, 命名返回支付成功, 但是成功后却返回如下的错误, 在测试环境都是没有任何问题, 到客户现场后, 可能客户现场使用的4G网络, 用微信支付时一直报这样的错误 错误现象: com.sun.o ...

  9. python内置常用内置方法详解

    # print(locals()) # print(globals()) def func(): x = 1 y = 1 print(locals()) # 函数内部的变量 print(globals ...

  10. Dev TreeList基本用法

    public partial class treelist_shijian : DevExpress.XtraEditors.XtraForm      {          public treel ...