Maison > Java > javaDidacticiel > Introduction à la transmission de valeurs de contexte (exemple de code)

Introduction à la transmission de valeurs de contexte (exemple de code)

不言
Libérer: 2018-10-18 15:25:41
avant
3247 Les gens l'ont consulté

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)))
    }
}
Copier après la connexion

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!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal