簡體   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