ajax跨域导致sessionid不一致

转载 2018年04月17日 10:46:14
转自: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  的请求 的场景,即 本次 “跨域” 并非 “大跨”,而是在 根域相同 的情况下,去 请求 不同的子域 

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

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

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

需求一:能让我跨就行

这也是最简单的需求,在 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哦~

跨域造成 sessionId不一致

最近开发一个web项目时因前后端分离,同事在本地开发h5页面,我这边后台开发时发现有跨域问题,所以,很常规的用cors过滤器给header加头信息,允许跨域请求,但却出现了另一个问题,每次请求的ses...
  • joefany
  • joefany
  • 2018-01-31 10:46:05
  • 287

跨域访问sessionid不一致问题

在开发过程中遇到这么一个问题,让我花了一个下午的大好时光才解决。但是解决玩之后,发现那么的容易。就是查找资料的时候很费劲。这里把问题记录一下。问题的产生 流程是这样的,要做一个用户登录的接口。在登录页...
  • u011521890
  • u011521890
  • 2017-07-02 19:09:54
  • 6722

ajax跨域问题解决sessionid不一致问题

java的web项目中由于前后台分离导致每次请求springmvc的session都不一样,所以无法在session中保存数据解决方法:ajax 跨域请求前台处理,红色字段为ajax处理跨域属性fun...
  • qq_41117519
  • qq_41117519
  • 2018-04-11 15:45:28
  • 5

解决跨域访问session丢失或不一致的问题

  • 2013年08月02日 17:24
  • 15KB
  • 下载

Ajax跨域请求保证同一个session的…

我们知道,根据浏览器的保护规则,跨域的时候我们创建的sessionId是不会被浏览器保存下来的,这样,当我们在进行跨域访问的时候,我们的sessionId就不会被保存下来,也就是说,每一次的请求,服务...
  • liliang950210
  • liliang950210
  • 2017-03-30 10:44:31
  • 1992

sessionid不一致问题

问题是这样的,调用后端的登录接口,而且是跨域访问,在添加购物车的时候登录接口的sessionid与之前在登录页面调用接口的sessionid不一样,所以总是提示没有登录,后来在网上找了很多资料都没有解...
  • chaitong2204
  • chaitong2204
  • 2018-02-11 10:39:25
  • 102

每次发起的request获取的sessionid不一致问题

遇到类似问题的博客不少,也没几个能说出个所以然或是给出一个合理的解决方案的。 找到一个博客还可以:http://blog.csdn.net/u011521890/article/details/73...
  • shenya2
  • shenya2
  • 2017-10-07 11:47:10
  • 1251

解决 前后端分离 跨域 sessionid每次都变化

前端开发使用的VUE,后端使用的java,前后端分离,因为跨域问题JSESSIONID每次请求都会变化,解决方法如下: 前端要将withCredentials设为true 以ajax请求为例:...
  • huang369509940
  • huang369509940
  • 2017-08-29 15:59:57
  • 4056

解决跨域,session不一致问题

今天前后交互 的时候发现session的id不一致。(我的逻辑是这样的,用户登录,账号密码都正确的时候,我就把用户信息放到session里面去,后续各种操作例如:获取用户信息等等。就不需要传递uid了...
  • qq_27373459
  • qq_27373459
  • 2017-08-11 16:22:29
  • 1216

解决页面的Session.SessionID不同的问题

今天突然发现apsx页面的session.SessionID在每次刷新或者点击按钮的时候,每次的SessionID都不同。和之前学到session是客户端与服务器端建立的会话,一但建立始终保存在服务器...
  • jianxue
  • jianxue
  • 2009-03-02 23:26:00
  • 1150
收藏助手
不良信息举报
您举报文章:ajax跨域导致sessionid不一致
举报原因:
原因补充:

(最多只允许输入30个字)