Heim >Java >javaLernprogramm >Einführung in die Kontextwertübergabe von Kontext (Codebeispiel)

Einführung in die Kontextwertübergabe von Kontext (Codebeispiel)

不言
不言nach vorne
2018-10-18 15:25:413246Durchsuche

Der Inhalt dieses Artikels ist eine Einführung in die Kontextwertübertragung (Codebeispiel). Ich hoffe, dass er für Freunde hilfreich ist.

Dieser Artikel beginnt mit einer systematischen Diskussion über die Verwendung von Kontext. Hier können Sie den Kontext sinnvoll nutzen, um einige schwierige Probleme in Ihrer Arbeit zu lösen.

Kontext kann zusätzlich zur Timeout-Verarbeitung auch zum Speichern von Daten verwendet werden. Wenn Sie Daten in mehreren Kontexten übergeben müssen, können die in diesem Artikel erwähnten Kenntnisse hilfreich sein.

Beispielcode

Beim Beispielcode handelt es sich um einen einfachen HTTP-Dienst, bei dem nach der Anmeldung die Startseite umgeleitet wird die Guard-Middleware. Natürlich führt der Beispielcode keine anderen Verarbeitungsvorgänge durch, z. B. das Herstellen einer Verbindung zur Datenbank, was nicht der Schwerpunkt dieses Artikels ist.
Nachdem die Guard-Funktion das Cookie gelesen hat, schreibt sie den Cookie-Wert in den Kontext und gibt ihn nach unten weiter. Man kann sagen, dass er in der gesamten Anfrage „transparent“ ist. Beim Zugriff auf die zu schützende Schnittstelle wird festgestellt, dass kein Cookie bereitgestellt wird, und die Terminalanforderung wird direkt gestellt. Andernfalls wird der Benutzernamenswert über r.WithContext im Cookie gespeichert, um die Nachteile der Geschäftsschnittstelle direkt zu vermeiden den Keks lesen. Denn wenn der Authentifizierungsalgorithmus später geändert wird, muss der Geschäftscode nicht geändert werden, sondern nur die Middleware direkt geändert werden.

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)))
    }
}

Dieser Artikel enthält nur eine begrenzte Menge Code und nur sehr wenig Inhalt. Ich hoffe, dass jeder dieses Tool gut nutzen kann.

Das obige ist der detaillierte Inhalt vonEinführung in die Kontextwertübergabe von Kontext (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen