我试图使用快速会话,但它没有按照我想要的方式工作。例如,如果我从浏览器访问http://127.0.0.1:8081/test 3次,我会在浏览器中看到以下响应:
未设置
已经设置
已经设置
当我一次又一次地访问此页面时,表示seeionID为唯一且会话不会被销毁。
但是,当我使用Ajax请求同一页面时,场景会发生变化,我在test.php文件中写道:
test.php的
<script type="text/javascript">
$(document).ready(function(){
setInterval(function(){
$.ajax({
type: 'get',
url: 'http://127.0.0.1:8081/test',
success: function(data){
console.log(data);
},
error: function(aa, bb, cc){
// console.log("Ajax error", aa, bb, cc);
}
});
}, 5000);
});
</script>
服务器端代码:
var express = require('express');
var mysql = require('mysql');
var session = require('express-session');
// var MySQLStore = require('express-mysql-session')(session);
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json({type: '*/*'}));
var http = require('http');
app.use(function (req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
next();
});
var server=http.createServer(app);
app.use(session({
secret: 'some secret',
resave: false,
// rolling: true,
saveUninitialized: true,
cookie: {
secure: false,
maxAge: 36000000,
httpOnly: false,
},
}));
app.get("/test", function(req, res, next){
console.log(req.session);
console.log(req.sessionID, req.session.name);
if(!req.session.name){
console.log("Not set.");
res.write("Not set");
req.session.name = "vikas kumar";
} else {
console.log("Already set");
res.write("Already set");
console.log(req.session.name);
}
res.end();
});
server.listen(8081, function(){
var host = server.address().address;
var port = server.address().port;
console.log("testApp socket server is listening at http://%s:%s", host, port+"\n\n");
});
由此,我在浏览器的控制台中看到以下响应:
未设置
未设置 未设置 ......等等。
注意:我没有使用默认的Memory Store进行会话。
我做错了吗?或者它与Ajax请求有关?
答案 0 :(得分:0)
您似乎正在对源代码进行ajax调用,该源代码与代码所在的网页不同。这使得它成为跨域请求(对不同域,端口或协议的任何请求都是交叉的起源)。交叉源请求严重使cookie处理变得复杂,因为这些cookie成为第三方cookie,浏览器可能拒绝这些cookie。这里有article on MDN关于相同原点与交叉原点的对比。
要在多个跨域域中允许Cookie,请参阅Access-Control-Allow-Origin Multiple Origin Domains和Why is jquery's .ajax() method not sending my session cookie?以及XMLHttpRequest.withCredentials。
一般的想法是,您使用凭据从服务器启用跨源访问,然后指示浏览器确定可以使用该跨源请求发送cookie。