mat*_*tgi 12 session hostheaders node.js express
我有一个单节点服务器响应请求并根据主机头重定向用户.用法是静态/家庭网站位于www,每个用户都有自己的子域(即www.example.com和site.example.com).路由按照site.js.
当用户未登录时,他们被重定向到登录.
我发现当用户被重定向到他们的子域时,会话不会被维护.我想这是预料之中的,但我想知道是否有办法在两个子域中维持相同的会话.
我希望如果他们登录并返回到www.example.com,他们会看到一个不同的视图,其中包含一个指向注销/他们的仪表板等的链接.我现在的解决方法是,我想,只是创建他们的子域上的会话,如果他们确实返回到www,就好像他们没有登录一样.
任何人之前处理过这个问题或得到如何以这种方式处理会话的答案?
我认为问题可能在users.js中,我重定向到'http://site.example.com',因为它不是相对路径...
这是相关的代码(用户查找是使用MongoDB完成的,我把它留作工作正常 - 调用此服务的行是users.authenticate)...
server.js:
app.configure ->
app.set "views", "#{__dirname}/views"
app.set "view engine", "jade"
app.use express.bodyParser()
app.use express.methodOverride()
app.use express.cookieParser()
app.use express.session {
key: "KEY",
secret: "SECRET",
store: new MemoryStore(),
cookie: {
domain: 'example.com',
maxAge : 1000*60*60*24*30*12
}
}
app.use express.static "#{__dirname}/public"
app.use express.logger "short"
app.use express.favicon "#{__dirname}/public/img/favicon.ico"
app.use app.router
Run Code Online (Sandbox Code Playgroud)
site.js:
module.exports = (app) ->
app.get '/', (req, res) ->
console.log "/ hit with #{req.url} from #{req.headers.host}"
domains = req.headers.host.split "."
org = if domains then domains[0] else "www"
if org == "www"
res.render "index", { layout: null }
else
if req.session.user
console.log "session established"
res.render "app", { layout: null }
else
console.log "no session"
res.redirect "http://www.example.com/accounts/login"
Run Code Online (Sandbox Code Playgroud)
users.js:
users = require('../services/users')
module.exports = (app) ->
app.get "/accounts/login", (req, res) ->
res.render "login", { layout: null, locals: { returnUrl: req.query.returnUrl } }
app.post "/accounts", (req, res) ->
users.authenticate app, req.body.login, req.body.password, (user) ->
if user
req.session.user = user
res.redirect "http://#{user.orgName}.example.com"
else
res.render "login", { layout: null, locals: { returnUrl: req.body.url } }
app.get "/accounts/logout", (req, res) ->
console.log "deleting user from session"
delete req.session.user
res.redirect "http://www.example.com
Run Code Online (Sandbox Code Playgroud)
要在OSX上本地测试它,我已将www.example.com和site.example.com添加到我的hosts文件中,以便在本地处理DNS查找.
mok*_*oka 26
首先,允许浏览器发出跨域请求,您需要在服务器端设置标头.此解决方案适用于正常请求以及AJAX.在您的快速配置功能中:
快递4.0:
var express = require('express');
var session = require('express-session');
var cookieParser = require('cookie-parser');
var app = express();
app.use(cookieParser());
app.use(session({
secret: 'yoursecret',
cookie: {
path: '/',
domain: 'yourdomain.com',
maxAge: 1000 * 60 * 24 // 24 hours
}
}));
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', req.headers.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();
});
Run Code Online (Sandbox Code Playgroud)
如果没有跨域cookie交换所需的会话,则可以将Access-Control-Allow-Origin设置为"*".要让cookie和会话共享跨域,您需要将特定的Access-Control-Allow-Origin设置为实际发出请求的域,这就是为什么req.headers.origin非常适合的原因.
使用域它无法在localhost上正常工作 - 因此请确保在开发环境中禁用它,并启用生产.它将在顶级域和子域之间启用共享cookie.
这还不是全部.它自己的浏览器不会通过跨域请求发送cookie,这必须强制执行.在jQuery中,您可以在$ .ajax()请求中添加额外的参数:
xhrFields: { withCredentials: true }
Run Code Online (Sandbox Code Playgroud)
对于非jQuery,只需要XHR构造函数并设置此参数:
xhr.withCredentials = true;
Run Code Online (Sandbox Code Playgroud)
并且您已准备好与共享会话进行跨域.
| 归档时间: |
|
| 查看次数: |
25060 次 |
| 最近记录: |