2013-09-30 23 views
10

Tôi có một tình huống mà một ứng dụng có thể được truy cập từ nhiều miền khác nhau. Ví dụ: foo.combar.com cả về mặt lý thuyết đều có thể trỏ đến ứng dụng của tôi. Ngoài ra, tên miền phụ của chúng cũng có thể trỏ đến ứng dụng của tôi, ví dụ: red.foo.comblue.foo.com. Tôi đang sử dụng phiên Cookie Express, và mã khởi tạo của tôi cho phiên trông như thế:Phiên Express với miền cookie khác nhau theo yêu cầu?

app.use(express.session({ 
    secret: "secret", 
    cookie: { 
     domain: ".foo.com" 
    }, 
    store: new MongoStore({ 
     db: db 
    }) 
})); 

Đó hoạt động tốt cho khi người dùng đi qua foo.com hoặc bất kỳ đó là tên miền phụ, nhưng bar.com sẽ không hoạt động. Tôi cần phải có cả hai cùng một lúc. Lý tưởng nhất, tôi sẽ đặt nó vào một tên miền khác nhau theo yêu cầu, nhưng tôi không chắc chắn làm thế nào tôi sẽ làm điều đó. Yêu cầu của tôi rất không đồng bộ và nếu tôi chỉ đặt nó cho toàn bộ ứng dụng theo mọi yêu cầu, tôi lo sợ nó có thể không hoạt động khi hai cuộc gọi đến cùng một lúc.

Điều này có thể thực hiện được không? Có ai có ý tưởng nào để giải quyết vấn đề này không?

+0

@fardjad điều này lý tưởng, bạn có thêm thông tin nào không? Tôi không phải là quen thuộc như tôi muốn tôi với middlewares –

+0

Vì vậy, về cơ bản, tôi sẽ lặp qua danh sách các lĩnh vực mà tôi muốn để có thể thiết lập các phiên trên, và làm một app.use cho mỗi một? Vì vậy, sẽ có một loạt các phần mềm trung gian 'express.session' khác được khởi tạo ở đầu ứng dụng của tôi và hoạt động trong suốt cuộc đời của ứng dụng của tôi? –

Trả lời

15

Dưới đây là những gì bạn làm:

  • viết một middleware ứng dụng của bạn có thể sử dụng ở vị trí của express.session mặc định middleware
  • trong middleware rằng, căn cứ vào yêu cầu host tiêu đề instatiate và cấu hình trên thể hiện của phiên middleware nhanh mỗi miền, và sau đó thực sự thực hiện chức năng trung gian thích hợp cho yêu cầu này

giả

var mwCache = Object.create(null); 
function virtualHostSession(req, res, next) { 
    var host = req.get('host'); //maybe normalize with toLowerCase etc 
    var hostSession = mwCache[host]; 
    if (!hostSession) { 
    hostSession = mwCache[host] = express.session(..config for this host...); 
    } 
    hostSession(req, res, next); 
    //don't need to call next since hostSession will do it for you 
} 

app.use(virtualHostSession); 

Yêu cầu của tôi là rất không đồng bộ và nếu tôi chỉ cần đặt nó cho toàn bộ ứng dụng tại mọi yêu cầu, tôi sợ nó có thể không hoạt động khi hai cuộc gọi đến trong cùng một lúc.

Tuyệt đối bạn không thể làm điều đó. Nó sẽ hoàn toàn không chính xác.

+0

HTTP cấm máy chủ miền X thiết lập cookie cho miền Y. Tôi tin rằng cách tiếp cận của tôi ở trên giải quyết vấn đề của người dùng như được mô tả, tuy nhiên nó sẽ không mang theo ID phiên duy nhất cho một trình duyệt truy cập nhiều tên máy chủ, nhưng nó sẽ cho phép một ứng dụng duy nhất hoạt động trên nhiều tên máy chủ. –

+0

Vâng, nếu bạn muốn bắt đầu chia sẻ thông tin trên các tên miền, hãy nhìn xa hơn thế giới tuyệt vời của theo dõi quảng cáo trực tuyến cho kho vũ khí của các kỹ thuật xâm lấn như pixel theo dõi, v.v. –

+0

Tôi vừa hoàn thành việc thực hiện nó và cuối cùng tôi có thể về nhà. Làm việc như một say mê. Bạn không có ý tưởng làm thế nào nhẹ nhõm tôi đã tìm ra điều này. Bởi vì một loạt các sự kiện, điều này đã xảy ra trên một máy chủ sống và nó cần phải được sửa chữa nhanh chóng. Cảm ơn bạn. –

Các vấn đề liên quan