遇到这样一个场景,就是前端的域是dev,请求接口时,接口的域是beta,即使在服务端设置了cookie存放的域,'COOKIE_DOMAIN'   =>  '.roboming.com',虽然cookie的域是正确了,可是sessionid的域还是不对,情况如下
这个是登陆页面
 

这是用户列表页,无法获取cookie,原因是两次请求不是同一个sessionid,服务器端,认为还没有登陆。

 
解决方法是:
1、php服务器端设置运行cros跨域请求
header("Access-Control-Allow-Origin:http://dev.roboming.com");
header('Access-Control-Allow-Credentials:true');
header('Access-Control-Allow-Methods:GET, POST, OPTIONS');
第二行代码是允许客户端带上cookie
2、js的ajax,设置
xhrFields:{
    withCredentials:true
},
设置之后,再次请求,请求结果如下:
 
这一次,请求的时候,把所有cookie都带上去了,第一次,之所以没有带上sessionid,因为sessionid的域是beta下的,而客户端是在dev域下,所以请求时,无法带上beta域下的sessionid。
整个提交如下
$.ajax({
                    url: 'http://beta.roboming.com/api.php?s=/Public/AdminLogin.html',
                    type: 'POST',
                    async:true,
                    xhrFields:{
                        withCredentials:true
                    },
                    data: {
                        username:userName,
                        password:pwd
                    },
                    success: function(respon){
                        console.log(respon);
                        var res=eval(respon);
                    },
                    error: function(){
                        alert('服务器发生错误!');
                    }
                });
 
 
原理:

Cross-Origin Resource Sharing,跨域资源共享,简称 CORS,可以作为一种跨域请求以及响应的解决方案,不过,使用的频率较少,原因大概有以下几种:

1、资料较少,网上搜到的“经验之谈”绝大多数也都是你抄我,我cp他,使用不当还可能造成安全隐患。

2、目前主流的处理方式是使用JSONP,易于实现,兼容性好,可查的资料也很多。而  IE10以下 版本的浏览器是不支持 CORS 的 ,因此,如果要求兼容IE浏览器,会导致使用此种方式的跨域请求以及传递Cookie的计划夭折,最终还得回归JSONP。

CORS的原理是:

W3C对你说:内个,同学们,我们为了解决跨域通信问题,新增了一个标准,大家在使用时,加一下就行了~

虽然是一句玩笑话,但。。事实确实如此。我们之所以能够“互联”,协议 是根基。

CORS的使用方式:

以下均是模拟 从 A. abc.com  发起一个到 B. abc.com  的请求 的场景,即 本次 “跨域” 并非 “大跨”,而是在 根域相同 的情况下,去 请求 不同的子域 

先解释一下,为什么要用 子域之间的请求 作为模拟场景:

这是因为多数人会认为跨域,就是不同根域之间的请求,或者认为根域相同的  不同的子域名之间是安全的调用,这些都是对跨域错误的认识。

实际上浏览器同源策略禁止了不同子域名之间的请求。

需求一:能让我跨就行

这也是最简单的需求,在 B 的服务端程序中,增加响应头:

// 使用通配符 * ,表示当前服务端 返回的信息允许所有源访问, 不推荐

header( 'Access-Control-Allow-Origin:*' );

// 指定可信任的域名来接收响应信息, 推荐

header( 'Access-Control-Allow-Origin:http://A.abc.com' );

如此一来,一个跨域请求就不会被浏览器的 同源安全策略所阻止了。

需求二:跨过去以后,我还得操作Cookie

Well~ 让我们在 B 的服务端程序中,继续补增响应头:

// 允许携带 用户认证凭据(也就是允许客户端发送的请求携带Cookie)

header( 'Access-Control-Allow-Credentials:true' );

同时,A 在向 B 发起请求的时候,需要将 XMLHttpRequest 对象的  withCredentials 属性设置为 true,JQuery1.5.1+ 提供了相应的字段,使用方式如下:

$.ajax({ 
        url:"B. abc.com ", 
        xhrFields:{ 
            withCredentials:true 
        },

});

这样,你会在 B 端发现:哦也~ 收到 Cookie 了。

设置 withCredentials 为 true 的请求中会包含 A 端的所有Cookie,这些Cookie仍然遵循同源策略,所以,你只能访问其中和 B 端同根域的Cookie,而无法访问其他域的Cookie。

总结一下就是:

要想跨域,你得有后台(需要服务器端配合)。

BTW:Firefox,发现你和Chrome的表现不一致的情况还真不多。Firefox中不要在同步模式(async:false)下传递Cookie哦~

ajax跨域请求时,sessionId不一样,导致无法记住登陆状态的更多相关文章

  1. 为什么返回的数据前面有callback? ashx/json.ashx?的后面加 callback=? 起什么作用 js url?callback=xxx xxx的介绍 ajax 跨域请求时url参数添加callback=?会实现跨域问题

    为什么返回的数据前面有callback?   这是一个同学出现的问题,问到了我. 应该是这样的: 但问题是这样的: 我看了所请求的格式和后台要求的也是相同的.而且我也是这种做法,为什么他的就不行呢? ...

  2. 在用AJAX跨域请求时遇到的问题

    刚刚接触ajax就遇到一个词--跨域. 在我百度了各种资料以后总结了一句话:“只要不是在一个协议.域.名端口下,都属于跨域(127.0.0.1本地也属于跨域)”. 在做ajax请求的时候,请求不到并且 ...

  3. ajax 跨域请求时url参数添加callback=?会实现跨域问题

    例如: 1.在 jQuery 中,可以通过使用JSONP 形式的回调函数来加载其他网域的JSON数据,如 "myurl?callback=?".jQuery 将自动替换 ? 为正确 ...

  4. SpringMvc+ajax跨域请求时,出现options类型的请求并返回403的解决方案

    在使用 $.ajax({ url:'http://127.0.0.1:8081/rest/ccxxx/xxxx', type:'POST', dataType:"json", co ...

  5. Ajax跨域请求,设置content

    在使用Ajax跨域请求时,如果设置Header的ContentType为application/json,会分两次发送请求.第 一次先发送Method为OPTIONS的请求到服务器,这个请求会询问服务 ...

  6. ASP.NET MVC 实现AJAX跨域请求方法《1》

    ASP.NET MVC 实现AJAX跨域请求的两种方法 通常发送AJAX请求都是在本域内完成的,也就是向本域内的某个URL发送请求,完成部分页面的刷新.但有的时候需要向其它域发送AJAX请求,完成数据 ...

  7. webapi 解决ajax跨域请求问题

    webapi在配置文件中加入这几句就可以解决ajax(同源策略是JavaScript里面的限制,其他的编程语言,比如在C#,Java或者iOS等其他语言中是可以调用外部的WebService,也就是 ...

  8. Nginx 实现AJAX跨域请求

    在工作中遇到跨域请求的问题: AJAX从一个域请求另一个域会有跨域的问题.那么如何在nginx上实现ajax跨域请求呢?要在nginx上启用跨域请求,需要添加add_header Access-Con ...

  9. jQuery ajax跨域请求的解决方法

    在Ajax应用中,jQuery的Ajax请求是非常容易而且方便的,但是初学者经常会犯一个错误,那就是Ajax请求的url不是本地或者同一个服务器下面的URI,最后导致虽然请求200,但是不会返回任何数 ...

随机推荐

  1. OC--初始化UINavigationController

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

  2. HNU 13064 Cuckoo for Hashing解题报告 North America - East Central 2013

    题目大意:使用两个哈希表来解决哈希冲突的问题.假如现在有两个哈希表分别为:H1,H2 ,大小分别为:n1,n2:现有一数据X需要插入,其插入方法为: 1.计算index1 = X MOD N1,  若 ...

  3. Spark中的键值对操作-scala

    1.PairRDD介绍     Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...

  4. DevExpress控件学习总结(转)

    DevExpress控件学习总结   1.Navigation & Layout 1.1 Bar Manager 如果想在窗体或用户控件(user control)上添加工具条(bars)或弹 ...

  5. Zepto.js-事件处理

    http://www.webdevs.cn/article/68.html     web开发网 事件 $.Event $.Event(type, [properties]) ⇒ event 创建并初 ...

  6. windows下安装php5.2.*,php5.3.*,php5.4.*版本的memcache扩展

    注:如使用集成环境成功率低,请自行配置php apache,表示win7下wamp php5.4.3基础上配置拓展,成功率极低.费时. 拓展安装调试方法: 编写调试php文件 <?php  me ...

  7. python 的日志相关应用

    python日志主要用logging模块; 示例代码如下: #coding:utf-8 import logging class logger(): ''' %(asctime)s %(filenam ...

  8. 2017了,回家前 "年末" 分享:下雨,飘雪,红包雨,碰撞球,自定义View

    (本博客为原创:http://www.cnblogs.com/linguanh/) 目录: 效果展示 感想 代码拆解 开源地址 效果展示 有没有兴趣继续看下去,直接看下"颜值"是第 ...

  9. venom结合Metasploit绕过360安全卫士

    原理:msfvenom是msfpayload和msfencode的结合体,利用msfvenom生成shellcode,venom生成工具使用了 一些 Veil-Evasion.py, unicorn. ...

  10. SQL 增删改查45道题

    create database School use School go create table Student --1.学生表 ( Sno ) not null primary key,--学号( ...