我正在从我的服务器发送请求到另一台服务器,并且我正在使用库https://github.com/request/request。
所以,我使用下一个代码:
router.post('/extern/*', function(req, res, next) {
var path = req.params['0'];
var input = req.body.text;
var encript = crypto.encrypt(input);
request.post(config.petitionServer + path).form({data: encript}).pipe(res)
});
会话在调用此帖子之前已初始化,但在执行时会重置会话。所以,在这种情况下,我从session var中丢失了csrf代码。
错误发生在'管道中。功能,因为如果我调用它会丢失会话,而不是在其他情况下,但我需要使用它。
如何在不丢失实际会话的情况下使用管道功能?
答案 0 :(得分:1)
我认为快递会将它的会话保存到cookie中,你正在做的是将config.petitionServer + path
的漏洞响应传递给客户端,以便覆盖快速会话保存的cookie。也许只是管道反复的身体是一个更好的主意?
router.post('/extern/*', function(req, res, next) {
var path = req.params['0'];
var input = req.body.text;
var encript = crypto.encrypt(input);
request.post({url: config.petitionServer + path, formData: {data: encript}, function(err, httpResponse, body))
res.send(body);
});
答案 1 :(得分:1)
正如其他答案所述,您的快速会话将通过从其他服务器发送的cookie重置。
有几种方法可以解决这个问题。如果您不需要请愿服务器中的cookie,您可以在管道响应之前删除标题:
router.post('/myServerUrl', function(req, res) {
request.post('/remoteServerUrl', { data })
.on('response', function(response) {
delete response.headers['set-cookie'];
})
.pipe(res);
});
如果您不想修改任何标头,您应该能够在响应处理程序内部处理响应以及内容类型。
router.post('/myServerUrl', function(req, res) {
request.post('/remoteServerUrl', { data })
.on('response', function(response) {
res.set('Content-Type', 'image/jpeg')
response.pipe(res);
});
});
答案 2 :(得分:0)
我创建了解决方案,这是我的不好。
会话在req.session
,请愿服务器也在使用快速会话模块。当请愿服务器收到请求时,该请求由请求服务器替换会话var。
解决方案是从请愿服务器中删除快速会话模块。
Anothe解决方案可以从主机服务器管理会话,防止替换它。但我没有这样做