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

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

不言
Freigeben: 2018-10-18 15:25:41
nach vorne
3240 Leute haben es durchsucht

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)))
    }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage