ajax跨域导致sessionid不一致转载

原创
小哥 3年前 (2022-11-11) 阅读数 121 #PHP
文章标签 PHP

转自:https://www.cnblogs.com/kangjianrong/p/6495131.html

遇到这样的场景,就是前端域。dev,请求接口时,接口的域为beta,即使在服务器端设置也是如此。cookie存储的域,COOKIE_DOMAIN   =>  .roboming.com,虽然cookie域名是正确的,sessionid域仍然是错误的,如下所示:

这是登录页面

这是用户列表页面,无法获取。cookie原因是这两个要求是不同的。sessionid,服务器端,认为尚未登录 。

解决方法是:

1、php服务器端设置运行cros跨域请求

1

2

3

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。

整份意见书如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

$.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  的请求 场景,即E。 本次 “跨域” 并非 “大十字”,但在 根域相同 万一去了 请求 不同的子域 。

首先解释你为什么想要使用它。 子域之间的请求 作为模拟场景:

这是因为大多数人认为跨域是不同根域之间的请求,或者根域是相同的。  不同子域之间存在安全呼叫,这些都是对跨域错误的感知。

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

需求1:让我过去

这也是最简单的要求,在中。 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+ 提供了相应的字段,并按如下方式使用:

1

2

3

4

5

6

$.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哦~

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门