繁体   English   中英

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

[英]How to pass headers while doing res.redirect in express js

我正在处理 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');
})

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

如果您使用 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');
});

正如人们询问是否有任何解决方法可以解决重定向后未正确设置事实标头的问题,实际上您可以使用两种方法:

首先,通过在重定向 url 中使用查询参数,您可以在客户端提取该参数。 您甚至可以在加载时使用历史 API 从 url 中删除它,如这里所示

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

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

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

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

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

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

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

res.stats(302).end()

我希望它有所帮助,亚伯

为什么你不能尝试 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)
        })

    })

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM