这个问题已被问过多次,但没有一个解决方案适合我。在node.js中,我使用express-session和connect-mongodb-session。我的客户端是使用React.js开发的。服务器和客户端都在本地主机上运行,但端口不同,分别为 8080 和 3000。以下是我的服务器代码:
import cors from "cors";
import session from "express-session";
const MongoDBStore = require("connect-mongodb-session")(session);
const corsOptions = {
origin : true,
credentials : true,
methods : ["GET", "POST", "PUT", "DELETE"]
};
const sessionStore = new MongoDBStore(
{
uri : process.env.MONGO_CON,
collection : "sessionStore"
}, (error : any) => {
if(error){
console.info("MONGO SESSION ERROR");
console.info(error.message);
}
console.info("SESSION STORE INITIALIZED");
});
sessionStore.on("error", (error : any) => {
if(error){
console.info("ON SESSION STORE ERROR");
console.info(error.message);
}
console.info("SESSION STORE IS ON");
});
const sessionProps : session.SessionOptions = {
secret : "secretKey",
resave : true,
saveUninitialized : true,
store : sessionStore,
cookie : {
secure : false,
httpOnly : false,
sameSite : "none",
domain : "http://localhost:8080/",
maxAge : 1000 * 60 * 60 * 24 * 7 // 1 day * 1 Week
}
};
app.use(cors(corsOptions));
app.use(session(sessionProps));
在我的 React 客户端中,我使用以下模块发送 AJAX 请求:
export const lats_ajax = (props : TypeAjax) => {
const params : any = props.params;
for(let key in params){
if(!params.hasOwnProperty(key)) continue;
const value = params[key];
params[key] = (typeof value === "object" || Array.isArray(value))
? JSON.stringify(value)
: value;
}
// Encode Keys & Data as URI String
const encodedParams = Object.keys(params)
.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
.join("&");
// Create & Initialize New HTTP Request
const httpRequest = new XMLHttpRequest();
httpRequest.open(props.method || "post", props.url, true);
httpRequest.withCredentials = true;
httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
// If Next is Available, Call Next When Request is finished & Response is ready
httpRequest.onreadystatechange = function(this : XMLHttpRequest){
if(this.readyState === 4 && props.next)
props.next({status : this.status, statusText : this.statusText, response : this.response}, props.carry);
};
// Send HTTP Request with Encoded Params
httpRequest.send(encodedParams);
};
在 Firefox 上一切正常,但在 Edge 和 Chrome 上,对于每个 Ajax 请求,服务器都会收到一个新的会话 ID。这个问题似乎只出现在 React 或不同的端口版本中,因为当我开发一个普通的 js 客户端并在与服务器相同的端口上运行时,新的会话 ID 问题根本不会发生。我检查了所有浏览器的设置,没有发现任何可以解决该问题的方法,但仍然无法理解为什么该问题仅出现在 Edge 和 Chrome 浏览器上,而没有出现在 Firefox 上。谢谢!
你好@Himanshu Agrawal,
你找到这个问题的答案了吗?我有类似的问题(无法在这里添加评论)
费边