Javascript Express.js跨域会话未保存
我正在尝试制作一个第三方应用程序,这意味着它将跨多个域运行。 我想为使用该应用程序的每个用户处理一个会话,因此,我使用了express session模块,但每次我发出请求时,它都会为当前请求启动一个新会话Javascript Express.js跨域会话未保存,javascript,node.js,express,express-session,Javascript,Node.js,Express,Express Session,我正在尝试制作一个第三方应用程序,这意味着它将跨多个域运行。 我想为使用该应用程序的每个用户处理一个会话,因此,我使用了express session模块,但每次我发出请求时,它都会为当前请求启动一个新会话 const express=require('express'), 路由器=express.router(); const session=require('express-session') 路由器使用(功能(req、res、next){ res.header('Access-Contro
const express=require('express'),
路由器=express.router();
const session=require('express-session')
路由器使用(功能(req、res、next){
res.header('Access-Control-Allow-Credentials',true);
res.header(“访问控制-允许-来源”,请求标题-来源);
res.header('Access-Control-Allow-Methods','GET、PUT、POST、DELETE');
res.header('Access-Control-Allow-Headers','X-request-With,X-HTTP-Method-Override,Content-Type,Accept');
next();
});
路由器。使用(会话)({
秘密:“键盘猫”,
雷萨夫:是的,
最大值:2*60*60*1000,//2小时
saveUninitialized:false,
曲奇:{
最大值:2*60*60*1000,
安全:错误,
sameSite:错,
httpOnly:false}
}))
router.get('/',函数(req,res,next){
//让payload=req.query;
设isDevClient=req.session.isDevClient | | false;
console.log('isNew?',isDevClient);
资源状态(201)。发送({
成功:没错,
isDevClient,
消息:“msg…”
});
}).post(“/”,函数(请求、恢复、下一步){
让有效载荷=请求主体;
console.log('isNew',req.session.isDevClient)
req.session.isDevClient=true;
资源状态(200)。发送({
成功:没错,
信息:“好的”
});
});
module.exports=路由器;
请求示例
//javascript
取('https://127.0.0.1:8443/',{
方法:“张贴”,
凭据:“包括”,
})
//Jquery
$.ajax({
'type':'post',
“url”:”https://127.0.0.1:8443',
“xhrFields”:{
'withCredential's:true
}
“成功”:函数(响应){},
})
``
使用凭据:“在获取
调用中包括”
,否则获取
在跨域请求期间不会发送cookie。例如:
fetch(..., {
...,
credentials: 'include'
}
更新:如果未设置SameSite属性,最近的Chrome版本似乎不会在跨域请求期间发送cookie
设置sameSite:“无”
应该可以修复它。请注意,chrome还要求这些cookie是安全的
顺便说一句,您可以很容易地使用repl.it(like)提供示例。使用
凭据:“在获取调用中包括”
,否则获取
在跨域请求期间不会发送cookie。例如:
fetch(..., {
...,
credentials: 'include'
}
更新:如果未设置SameSite属性,最近的Chrome版本似乎不会在跨域请求期间发送cookie
设置sameSite:“无”
应该可以修复它。请注意,chrome还要求这些cookie是安全的
顺便说一下,您可以很容易地用repl.it(like)提供示例您确定saveUninitialized应该为false吗?我认为这就是问题所在,因为您的会话不是savedI。在它与现在一样之前,我已经尝试过实现它……您是如何提出请求的?提供一个。您是否在响应中看到Set Cookie
标题?浏览器是否在下一个请求中发送cookie?查看浏览器开发工具中的“网络”选项卡,我通过简单的ajax或fetch发出请求。我在chrome dev toolsHey man的网络tad中看到响应头中的Set Cookie
头,你知道吗?我遇到了相同的问题。您确定saveUninitialized应该为false吗?我认为这就是问题所在,因为您的会话不是savedI。在它与现在一样之前,我已经尝试过实现它……您是如何提出请求的?提供一个。您是否在响应中看到Set Cookie
标题?浏览器是否在下一个请求中发送cookie?查看浏览器开发工具中的“网络”选项卡,我通过简单的ajax或fetch发出请求。我在chrome dev toolsHey man的网络tad中看到响应头中的Set Cookie
头,你知道吗?我也遇到了同样的问题。我用过它,它会在原始的postAh上显示一个例子,我想你有一个更新版本的chrome,如果没有SameSite属性,它不会发送cookie。我将更新我的回答我已经更改了服务器端的sameSite:“none”
,但它似乎不起作用。您注意到安全部分了吗?应该改成是的这就是我现在的<代码>路由器。使用(会话({secret:'keyboard cat',resave:true,maxAge:2*60*60*1000,//2小时saveUninitialized:false,cookie:{maxAge:2*60*60*1000,secure:false,sameSite:'none',httpOnly:false}))
我已经使用过它,它将在原始postAh上显示一个示例,我猜你有一个更新版本的chrome,如果没有SameSite属性,它不会发送cookie。我将更新我的回答我已经更改了服务器端的sameSite:“none”
,但它似乎不起作用。您注意到安全部分了吗?应该改成是的这就是我现在的<代码>路由器。使用(会话({secret:'keyboard cat',resave:true,maxAge:2*60*60*1000,//2小时saveUninitialized:false,cookie:{maxAge:2*60*60*1000,secure:false,sameSite:'none',httpOnly:false}))