我有一个使用快速会话的Web应用程序。在Safari和MacOS上的Chrome以及在iOS上的Chrome上,一切正常。但是,在iOS Safari上,尽管会话已保存到商店,但Safari似乎在后续页面加载时生成了新会话。对于我来说不幸的是,此Web应用程序的目标浏览器实际上是Safari上的iOS(这是我无法控制的)。
尽管此问题出现在使用Postgres支持的会话存储的更复杂的Web应用程序中,但我也可以使用开箱即用的Express Generator创建的应用程序重新创建它。
对于测试应用,会话的配置如下:
app.use(session({
resave: false,
saveUninitialized: false,
secret: 'xxxxxxxxxxxx',
proxy: true,
cookie: {secure:true},rolling: true
}));
在/ users路由上,我设置了一个新的foo
对象
/* GET users listing. */
router.get('/', function(req, res, next) {
req.session.foo = "Foo in session"
res.send('respond with a resource');
});
索引路由仅打印出会话的值。
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express', session:JSON.stringify(req.session) });
});
在除移动Safari之外的所有浏览器上,会话都包含foo
(在访问/users
路由之后。
有人知道这里会发生什么吗?这是托管在Google App Engine上的,我也尝试过设置trust proxy
。
已经使用Nginx和相同的主要节点版本(8)在Google Compute Engine上运行了该测试应用程序,我可以确认这确实适用于移动Safari。因此看来问题出在App Engine沿线的某个地方。
更多测试表明,即使设置了secure:true
,也是trust proxy
引起了问题。不知道这是iOS错误,Express还是App Engine问题。