在项目中,前端用的vue,后端用php作为服务端,后端通过ajaxreturn返回数据,前端通过ajax方式来提交数据,在做登录的时候,为了保存用户名到session,在后端是不同的方法中,一个方法设置session值,一个方法在登录时来对比提交过来的令牌数据,也是从session中获取值。可是,事实上是我在设置值的那个方法通过dump也能打印出来session的值,可是在提交登录的另一个方法中就不能获取到该session值了,这就奇怪了,dump打印出来的便是一个空数组,这下百度折腾了大半天,终于知道为什么呢,通过session_id()的方式来查看到这两个方法中操作的session,每个session_id都是不一样的,这就相当于是操作到了不同的session值了,然后,又想将session_id通过传值的方式传递过去,在赋值该session_id的值能行么,呵呵,想法是好的,事实证明,这样做还是徒劳而不功。
最后,发现原来session_id是通过cookie来传递到后台的,前端的vue在使用get方式,并且附上
credentials: "include",
withCredentials: true
这两个option,果然,通过get方式获取到了相同的session_id,但是改回post又不行了,ajax得到的是空数组,原来post是同样阻止了cookie的发送,最后,是在前后端都改了,前端在main.js中添加了一个拦截器
Vue.http.options.crossOrigin = true
Vue.http.interceptors.push((request, next) => {
request.credentials = true;
next();
});
后端代码:
header('Access-Control-Allow-Credentials:true');//注意,当这个设置为true的时候
header('Access-Control-Allow-Origin:http://127.0.0.1:8080'); //这地址只能是指定好的,不能是*
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
header('Access-Control-Allow-Methods: GET, POST, PUT,DELETE');
header('Access-Control-Allow-Origin:http://127.0.0.1:8080'); //这地址只能是指定好的,不能是*
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
header('Access-Control-Allow-Methods: GET, POST, PUT,DELETE');
设置好之后,在通过get或是post都能愉快的获取到后台反馈的令牌了。
ajax 提交导致session丢失问题:等您坐沙发呢!