提问人:Himanshu Agrawal 提问时间:8/14/2023 更新时间:8/14/2023 访问量:27
Nose JS Express 会话为每个 http 请求接收新会话
Nose JS express session receives new session for every http request
问:
这个问题已经被问过很多次了,但没有一个解决方案适合我。在 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。谢谢!
答: 暂无答案
评论