好的,所以我有一个基于子域运行的express / mongo应用程序。我已经读过,通过将Cookie的域名设置为.mydomain.com,可以将子域名Cookie用于子域名。
这应该有效,但我无法弄清楚如何将该属性转换为默认的浏览器cookie(connect.sid)。
我使用快速会话进行会话,使用connect-mongo来持久化会话,当然还有cookie-parser使这一切都能正常运行。
似乎有几个不同的地方我可以设置此属性,但它们似乎都没有对我在Chrome的开发工具中看到的实际cookie产生任何影响。 :(
这是应用配置块:
app.use(bodyParser());
app.use(methodOverride());
app.use(cookieParser('judy_has_cooties', { domain: '.' + app.settings.domainToUse }));
app.use(express.static(__dirname + '/app'));
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
next();
});
app.use(session({
secret: app.config.secret,
cookie: {
domain: '.' + app.settings.domainToUse,
path: '/',
httpOnly: true,
secure: false,
maxAge: null
},
store: new MongoStore({url: app.config.db }, function(err){
console.log('session store is up.');
})
}));
app.use(subdomain({
base : app.settings.domainToUse + '',
removeWWW : true
}));
//app.use(morgan());
app.set('port', process.env.PORT || 3000);
app.engine('html', require('ejs').renderFile);
app.set('views', __dirname + '/app/views');
app.set('view engine', 'html');
app.server = require('http').createServer(app);
mongoose.connect(app.config.db);
require('./config/configure-routes')();
// Start server
app.server.listen(app.get('port'), function(){
console.log(">>>>> Node server is listening on port " + app.get('port'));
});
在我登录之前,我没有在浏览器中获取connect.sid cookie,所以我认为在调用sessionStore.set()时它已经完成了。我不清楚的是设置实际的浏览器cookie是什么。当我从某些路由auth中间件注销req.session对象时,我看到了所有正确的设置,但实际的浏览器cookie并没有反映这些设置。
我认为会话cookie实际上只是在服务器上的会话存储中而不是在浏览器中吗?而connect.sid只是一个查找这些cookie的句柄?
如果是这样,我如何向浏览器cookie添加更多数据以使其在子域之间保留?
感谢并抱歉可能无法理解会话和Cookie如何协同工作。
答案 0 :(得分:1)
啊!好的,我真的希望这对某人有所帮助,因为我在墙上撞了两天我的脑袋。
所以,显然这不是与节点或我的服务器配置有关的问题。这纯粹是一个cookie问题。
Cookies似乎对于他们在domain =字段中收到的模式非常抱怨。如果某些东西不是1000%正确,那么它将会barf,而根本就不会设置cookie。
端口号如:3000的域将无法使用,localhost将无法使用.localhost格式启用子域。它需要一个。域名中的某些地方才有效。
要在本地执行此操作,我必须进入我的本地DNS设置并设置.dev网址以重定向到localhost。痛苦的屁股!如果您使用OSX,这里有一个很棒的链接。
http://clintberry.com/2011/wildcard-sub-domains-on-osx-web-development-on-localhost/
一旦设置完毕,它就会像流氓一样工作!
祝你好运padewan。