栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用自定义的http.ResponseWriter基于代理请求的响应编写cookie?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用自定义的http.ResponseWriter基于代理请求的响应编写cookie?

从有关

http.ResponseWriter
方法的文档中:(
添加了重点)

  • Header() http.Header

除非修改后的标头是预告片,否则在 调用WriteHeader(或Write)后 更改标头映射 无效

  • WriteHeader(statusCode int)

WriteHeader 发送 带有提供的状态代码 的HTTP响应标头

  • Write([]byte) (int, error)

如果尚未 调用WriteHeader ,则Write 在写入数据之前会 调用WriteHeader(http.StatusOK)

这应该强调为什么,你不能设置在后一个cookie的原因

next.ServeHTTP(w,r)
调用,这是在通过电话执行的中间件链中的处理程序中的一个或者打电话
WriteHeader
Write
直接或间接的。

因此,要能够在调用 之后 设置cookie

next.ServeHTTP(w,r)
您需要确保中间件链调用
WriteHeader
Write
原始
http.ResponseWriter
实例中没有任何处理程序。一种方法是将原始实例包装在自定义
http.ResponseWriter
实现中,该实现将
推迟 响应的编写,直到完成cookie设置为止。


例如这样的事情:

type responsewriter struct {    w    http.ResponseWriter    buf  bytes.Buffer    pre int}func (rw *responsewriter) Header() http.Header {    return rw.w.Header()}func (rw *responsewriter) WriteHeader(statusCode int) {    rw.pre = statusCode}func (rw *responsewriter) Write(data []byte) (int, error) {    return rw.buf.Write(data)}func (rw *responsewriter) Done() (int64, error) {    if rw.pre > 0 {        rw.w.WriteHeader(rw.pre)    }    return io.Copy(rw.w, &rw.buf)}

您可以在中间件中像这样使用它:

func handler(next http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        rw := &responsewriter{w: w}        next.ServeHTTP(rw, r)        if r.Method == "POST" && r.URL.String() == "/login" { foo := rw.Header().Get("X-FOO") setcookie(rw, "MYAPPFOO", foo)        }        if _, err := rw.Done(); err != nil { log.Println(err)        }    })}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/452385.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号