导出上下文值键的安全方法?

问题描述 投票:0回答:1

我听说应该将上下文值密钥保密,如下所示:

type contextKey int

const (
    requestIDKey contextKey = iota
    otherKey
)

然而今天我遇到了golang如何定义

ServerContextKey
:

type contextKey struct {
    name string
}

var (
    ServerContextKey = &contextKey{"http-server"}
    LocalAddrContextKey = &contextKey{"local-addr"}
)

这是否意味着我们可以导出上下文值键并让其他包使用

context
context.WithValue(ctx, ServerContextKey, localvar)
对象中检索值? 谢谢。

go go-context
1个回答
0
投票

是的,您当然可以从包中导出上下文键。要确保的关键是您使用自己定义的类型来避免与可能具有相同值的其他包中的键发生冲突。上下文键本质上是一个接口,因此即使两个不同的键具有相同的值,由于它们的类型不同,这些键仍然会指向不同的值。

例如:

package main

import (
    "context"
    "fmt"
)

type contextKeyA int
type contextKeyB int

func main() {
    keyA := contextKeyA(1)
    keyB := contextKeyB(1)

    ctx := context.WithValue(context.Background(), keyA, "valueA")
    ctx = context.WithValue(ctx, keyB, "valueB")

    fmt.Println(ctx.Value(keyA)) // prints: valueA
    fmt.Println(ctx.Value(keyB)) // prints: valueB
}

在此示例中,即使

keyA
keyB
具有相同的基础值 (1),它们也被视为不同的键,因为它们属于不同的类型(
contextKeyA
contextKeyB
)。因此,它们在上下文中指向不同的值。

© www.soinside.com 2019 - 2024. All rights reserved.