视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Ajax跨域访问时Cookie丢失怎么解决
2020-11-27 19:56:54 责编:小采
文档


这次给大家带来Ajax跨域访问时Cookie丢失怎么解决,解决Ajax跨域访问时Cookie丢失的注意事项有哪些,下面就是实战案例,一起来看一下。

ajax跨域访问,可以使用jsonp方法或设置Access-Control-Allow-Origin实现,关于设置Access-Control-Allow-Origin实现跨域访问可以参考之前我写的文章《ajax 设置Access-Control-Allow-Origin实现跨域访问》

1.ajax跨域访问,cookie丢失

首先创建两个测试域名

a.fdipzone.com 作为客户端域名

b.fdipzone.com 作为服务端域名

测试代码

setcookie.PHP 用于设置服务端cookie

<?php
setcookie('data', time(), time()+3600);
?>

server.php 用于被客户端请求

<?php
$name = isset($_POST['name'])? $_POST['name'] : '';
$ret = array(
 'success' => true,
 'name' => $name,
 'cookie' => isset($_COOKIE['data'])? $_COOKIE['data'] : ''
);
// 指定允许其他域名访问
header('Access-Control-Allow-Origin:http://a.fdipzone.com');
// 响应类型
header('Access-Control-Allow-Methods:POST'); 
// 响应头设置
header('Access-Control-Allow-Headers:x-requested-with,content-type');
header('content-type:application/json');
echo json_encode($ret);
?>

test.html 客户端请求页面

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
 <meta http-equiv="content-type" content="text/html;charset=utf-8">
 <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
 <title> ajax 跨域访问cookie丢失的解决方法 </title>
 </head>
 <body>
 <script type="text/javascript">
 $(function(){
 $.ajax({
 url: 'http://b.fdipzone.com/server.php', // 跨域
 dataType: 'json',
 type: 'post',
 data: {'name':'fdipzone'},
 success:function(ret){
 if(ret['success']==true){
 alert('cookie:' + ret['cookie']);
 }
 }
 });
 })
 </script>
 </body>
</html>

首先先执行http://b.fdipzone.com/setcookie.php, 创建服务端cookie。

然后执行http://a.fdipzone.com/test.html

输出

{"success":true,"name":"fdipzone","cookie":""}

获取cookie失败。

2.解决方法

客户端

请求时将withCredentials属性设置为true

使可以指定某个请求应该发送凭据。如果服务器接收带凭据的请求,会用下面的HTTP头部来响应。

服务端

设置header

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

允许请求带有验证信息

test.html 修改如下

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
 <meta http-equiv="content-type" content="text/html;charset=utf-8">
 <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
 <title> ajax 跨域访问cookie丢失的解决方法 </title>
 </head>
 <body>
 <script type="text/javascript">
 $(function(){
 $.ajax({
 url: 'http://b.fdipzone.com/server.php', // 跨域
 xhrFields:{withCredentials: true}, // 发送凭据
 dataType: 'json',
 type: 'post',
 data: {'name':'fdipzone'},
 success:function(ret){
 if(ret['success']==true){
 alert('cookie:' + ret['cookie']);
 }
 }
 });
 })
 </script>
 </body>
</html>

server.php 修改如下

<?php
$name = isset($_POST['name'])? $_POST['name'] : '';
$ret = array(
 'success' => true,
 'name' => $name,
 'cookie' => isset($_COOKIE['data'])? $_COOKIE['data'] : ''
);
// 指定允许其他域名访问
header('Access-Control-Allow-Origin:http://a.fdipzone.com');
// 响应类型
header('Access-Control-Allow-Methods:POST'); 
// 响应头设置
header('Access-Control-Allow-Headers:x-requested-with,content-type');
// 是否允许请求带有验证信息
header('Access-Control-Allow-Credentials:true');
header('content-type:application/json');
echo json_encode($ret);
?>

按之前步骤执行,请求返回

{"success":true,"name":"fdipzone","cookie":"1484558863"}

获取cookie成功

3.注意事项

1.如果客户端设置了withCredentials属性设置为true,而服务端没有设置Access-Control-Allow-Credentials:true,请求时会返回错误。

XMLHttpRequest cannot load http://b.fdipzone.com/server.php. Credentials flag is 'true', but the 'Access-Control-Allow-Credentials' header is ''. It must be 'true' to allow credentials. Origin 'http://a.fdipzone.com' is therefore not allowed access.

2.服务端header设置Access-Control-Allow-Credentials:true后,Access-Control-Allow-Origin不可以设为*,必须设置为一个域名,否则回返回错误。

XMLHttpRequest cannot load http://b.fdipzone.com/server.php. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' heade

下面看下Ajax跨域请求COOKIE无法带上的解决办法

原生ajax请求方式:

var xhr = new XMLHttpRequest(); 
xhr.open("POST", "http://xxxx.com/demo/b/index.php", true); 
xhr.withCredentials = true; //支持跨域发送cookies
xhr.send();

jquery的ajax的post方法请求:

 $.ajax({
 type: "POST",
 url: "http://xxx.com/api/test",
 dataType: 'jsonp',
 xhrFields: {
 withCredentials: true
 },
 crossDomain: true,
 success:function(){
 },
 error:function(){
 }
})

服务器端设置:

header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Origin: http://www.xxx.com");

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

用Ajax实现注册与头像上传功能

使用ajax实现分页技术的步奏详解(附代码)

在Ajax的请求中async:false与async:true有什么区别

下载本文
显示全文
专题