Golang中如何设置重定向时的Header

Golang中如何设置重定向时的Header 你好,

我设置了一个Header值并执行了重定向。

w.Header().Set("Authorization", "Bearer "+token)
w.Header().Set("Location","/dashboard")
w.WriteHeader(301)
w.Write([]byte{})

响应头没有被设置!为什么?我如何才能让重定向携带我原来的头信息?

15 回复

你想设置哪个请求头?

更多关于Golang中如何设置重定向时的Header的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我仍在努力理解,为什么服务器响应中需要请求的 Authorization 头?

谢谢……这正是我想要的答案! 😚 欢迎加入社区!

我希望在登录后重定向到仪表板,并携带授权值 ("Authorization", "Bearer "+token)

func main() {
    fmt.Println("hello world")
}

如果你想保留旧数据(头部、方法、正文等),请使用 HTTP 状态码 308 替代。客户端将向新位置重新发送所有数据。(某些客户端,如 OkHttp,可能不接受 308 方法。)

这是同样的问题,头部没有设置!

有什么原因让你不使用Redirect吗?也许可以这样:

w.Header().Set("Authorization", "Bearer "+token)
http.Redirect(w, r, "/dashboard", 301)

是的,这是一个关于Go的问题,因为我在寻找服务器端HTTP响应/请求的解决方案。Cookie不太好用,我已经放弃它了!

如果你帮不了我,没关系,没问题,但请不要试图寻找不回答这个问题的理由而让自己分心。

哪个头部没有被设置?如果你指的是 Authorization,请注意这是一个请求头部。在响应中设置它是没有意义的。

https://developer.mozilla.org/de/docs/Web/HTTP/Headers/Authorization

请注意,这并不是一个专门针对 Go 的问题。HTTP 的工作原理是相同的,无论你使用哪种编程语言作为后端。

所以也许这个论坛不是讨论这个问题的合适地方。

在响应中设置包含 JWT 的 cookie 怎么样?后端应该能够同时从 cookie 和 Authorization 头部提取 JWT。

您应该将此拆分为两个请求:

  1. 登录:服务器在响应体中返回令牌,状态码为 200 OK。客户端保存该令牌以供后续请求使用。
  2. 打开仪表板:客户端请求 /dashboard,并使用从上一个请求结果中收到的令牌设置 Authorization 请求头。

重定向不会将头部信息传递到目标地址,如果你是在问这个的话。你必须使用其他方法来转发头部信息,例如会话。

func main() {
    fmt.Println("hello world")
}

stackoverflow.com

http.Redirect() with headers

标签: http, go

如何通过重定向设置一个头部???

好的,这是一种众所周知的方法!但是,客户端是一个普通的网站,包含带有标签链接的导航,我无法通过调用下一页来设置请求头。是的,我喜欢JS,但你只能在发起Ajax请求时设置请求头,从浏览器设置的请求头是无效的。参考链接:https://developer.mozilla.org/en-US/docs/Web/API/Headers/set

当我使用单页应用或Vue/React时,那么所有的调用都是Ajax调用。

我一直希望通过设置和获取请求头,在服务器端循环使用JWT令牌。

在Golang中,重定向时设置Header的正确方法是使用http.Redirect函数或手动设置状态码。你的代码存在几个问题:

  1. 301重定向不会保留Authorization头 - 浏览器不会在重定向时传递Authorization头
  2. WriteHeader调用时机 - 一旦调用WriteHeader,后续的Header修改不会生效

以下是正确的实现方式:

// 方法1:使用http.Redirect(适用于简单重定向)
http.Redirect(w, r, "/dashboard", http.StatusFound)

// 方法2:手动设置重定向并保留Header(需要特殊处理)
func redirectWithHeaders(w http.ResponseWriter, r *http.Request, url string, status int) {
    // 先设置所有Header
    w.Header().Set("Custom-Header", "value")
    w.Header().Set("Location", url)
    
    // 最后设置状态码
    w.WriteHeader(status)
    
    // 可选的响应体
    fmt.Fprintf(w, "Redirecting to %s...", url)
}

// 在处理器中使用
func handler(w http.ResponseWriter, r *http.Request) {
    token := "your_token_here"
    
    // 注意:浏览器不会在重定向时自动传递Authorization头
    // 你需要考虑其他方案,如:
    // 1. 使用Cookie存储token
    // 2. 使用Session
    // 3. 在重定向URL中传递token参数
    
    // 设置Cookie替代Authorization头
    http.SetCookie(w, &http.Cookie{
        Name:     "auth_token",
        Value:    token,
        Path:     "/",
        HttpOnly: true,
        Secure:   true, // 仅在HTTPS中使用
    })
    
    // 执行重定向
    redirectWithHeaders(w, r, "/dashboard", http.StatusFound)
}

如果你需要在重定向中传递认证信息,建议使用以下方案:

// 使用URL参数传递token(注意安全风险)
func redirectWithToken(w http.ResponseWriter, r *http.Request) {
    token := "your_token_here"
    redirectURL := fmt.Sprintf("/dashboard?token=%s", url.QueryEscape(token))
    http.Redirect(w, r, redirectURL, http.StatusFound)
}

// 或者使用加密的Session
func redirectWithSession(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "session-name")
    session.Values["authenticated"] = true
    session.Values["token"] = "your_token_here"
    session.Save(r, w)
    
    http.Redirect(w, r, "/dashboard", http.StatusFound)
}

关键点:

  • 浏览器不会在重定向时传递Authorization头
  • 考虑使用Cookie、Session或URL参数替代
  • 确保在调用WriteHeader之前设置所有Header
  • 对于敏感信息,建议使用HTTPS和安全Cookie
回到顶部