如何在express js中执行res.redirect时传递标头

时间:2016-10-12 11:26:41

标签: javascript node.js express

我正在使用express js,我需要重定向到需要身份验证的页面。这是我的代码:

router.get('/ren', function(req, res) {
    var username = 'nik',
        password = 'abc123',
        auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');

    res.redirect('http://localhost:3000/api/oauth2/authorize');
})

如何设置此重定向命令的标头?

5 个答案:

答案 0 :(得分:5)

如果您使用301(永久移动)或302(找到)重定向​​,则不会自动转发标头?

如果没有,这就是你设置标题的方法:

res.set({
  'Authorization': auth
})

res.header('Authorization', auth)

然后调用

res.redirect('http://localhost:3000/api/oauth2/authorize');

最后,类似的东西应该有效:

router.get('/ren', function(req, res) {
    var username = 'nik',
        password = 'abc123',
    auth = "Basic " + new Buffer(username + ":" + password).toString("base64");

    res.header('Authorization', auth);

    res.redirect('http://localhost:3000/api/oauth2/authorize');
});

答案 1 :(得分:1)

它不是 Express 或任何后端限制,只是浏览器的工作方式,Express 只响应重定向标头,浏览器实现重定向,如果您重定向到同一个域,那么您将获得所有标头、cookie和原始有效载荷。

但是,如果您要重定向到另一个域,出于安全原因,浏览器会撕掉标头,您对此无能为力,因此,如果您确实需要这样做,则需要使用外部服务使用您的在后端拥有自己的服务,与重定向头无关,因为这取决于浏览器的实现。

答案 2 :(得分:0)

由于人们已经询问是否有关于重定向后未正确设置标题的事项的解决方法,实际上有两种方法可以使用:

首先,通过在重定向网址中使用查询参数,您可以在客户端提取该参数。您甚至可以使用历史记录API从网址加载时删除它,例如显示here

history.pushState(null, '', location.href.split('?')[0])

另一种解决方案是在重定向之前设置cookie,并将其放入客户端。就个人而言,我更喜欢它,因为它不会以任何方式污染我的网址,我只需要通过一个简单的帮助程序在加载时删除这个cookie:

export const removeCookie = name => {
  document.cookie = `${name}=; Max-Age=0`
}

答案 3 :(得分:0)

为什么不能尝试axios库

    npm install axios

然后

    return new Promise((resolve, reject) => {

        axios({
            "headers" : {
                "content-type" : "application/vnd.api+json"
            },
            "method" : method,
            "url" : url,
            "data" : data
        }).then((ax_res) => {
            var obj = {
                "status" : ax_res.status,
                "data" : ax_res.data
            }
            resolve(obj)
            return(obj)
        }).catch((ax_res) => {
            var obj = {
                "status" : ax_res.response.status,
                "data" : ax_res.response.data
            }
            resolve(obj)
            return(obj)
        })

    })

答案 4 :(得分:-1)

我还没有尝试过这种解决方案,但是我认为值得一试。

res.location(REDIRECT_URL)
res.set(HEADERS)

res.stats(302).end()

我希望它会有所帮助, 亚伯