Ce que cet article vous apporte est une introduction au transfert de valeur contextuelle (exemple de code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Cet article lancera une discussion systématique sur l'utilisation du contexte. Ici, vous pourrez utiliser le contexte de manière raisonnable pour résoudre certains problèmes difficiles dans votre travail.
Le contexte peut également être utilisé pour enregistrer des données en plus du traitement du délai d'attente. Lorsque vous devez transmettre des données lors du passage de plusieurs contextes, les connaissances mentionnées dans cet article peuvent s'avérer utiles.
Exemple de code
L'exemple de code est un simple service http. Le processus est qu'après la connexion, la page d'accueil sautera via le middleware de garde. . Bien entendu, l’exemple de code n’effectue aucun autre traitement tel que la connexion à la base de données, qui n’est pas l’objet de cet article.
Une fois que la fonction de garde a lu le cookie, elle écrit la valeur du cookie dans le contexte et la transmet vers le bas. On peut dire qu'elle est "transparente" dans l'ensemble de la requête. Lors de l'accès à l'interface à protéger, il est détecté qu'aucun cookie n'est fourni et la demande du terminal est effectuée directement. Sinon, la valeur du nom d'utilisateur est stockée dans le cookie via r.WithContext pour éviter directement les inconvénients de l'interface métier. lire le cookie. Car si l'algorithme d'authentification est modifié ultérieurement, le code métier n'a pas besoin d'être modifié, il suffit de modifier directement le middleware.
package main import ( "context" "fmt" "log" "net/http" "time" ) func main() { mux := http.NewServeMux() mux.HandleFunc("/", guard(home)) mux.HandleFunc("/login", login) log.Fatal(http.ListenAndServe(":8080", mux)) } // 登录 func login(w http.ResponseWriter, r *http.Request) { if r.URL.Query().Get("username") != "root" { http.Error(w, http.StatusText(401), 401) return } cookie := &http.Cookie{Name: "username", Value: "root", Expires: time.Now().Add(time.Hour)} http.SetCookie(w, cookie) http.Redirect(w, r, "/", 302) } func home(w http.ResponseWriter, r *http.Request) { username := r.Context().Value("username") fmt.Fprintf(w, "welcome login: %s", username.(string)) } // 守卫 func guard(handleFunc http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // check username log.Printf("%s - %s\n", r.Method, r.RequestURI) cookie, err := r.Cookie("username") if err != nil || cookie == nil { // 如果username为空直接拦截 http.Error(w, http.StatusText(401), 401) return } handleFunc(w, r.WithContext(context.WithValue(r.Context(), "username", cookie.Value))) } }
Il n'y a qu'une quantité limitée de code dans cet article et très peu de contenu. J'espère que tout le monde pourra faire bon usage de cet outil.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!