This article brings you an introduction to the context value transfer of context (code example). It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.
This article will start with a systematic discussion on the usage of context. Here you will be able to use context reasonably to solve some difficult problems at work.
Context can also be used to save data in addition to timeout processing. When you need to pass data when passing multiple contexts, then the knowledge mentioned in this article can come in handy.
Sample code
The sample code is a simple http service. The process is that after logging in, the homepage will jump. The homepage is authenticated through the guard middleware. Of course, the sample code does not do other processing such as connecting to the database, which is not the focus of this article.
After the guard function reads the cookie, it writes the cookie value into the context and passes it down. It can be said to be "transparent" in the entire request. When accessing the interface that needs to be protected, it is detected that no cookie is provided, and the terminal request is made directly. Otherwise, the username value is stored in the cookie through r.WithContext to avoid the disadvantages of the business interface directly reading the cookie. Because if the authentication algorithm is changed later, the business code does not need to be changed, just change the middleware directly.
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))) } }
This article only has so much code and very little content. I hope everyone can make good use of this tool.
The above is the detailed content of Introduction to context value passing of context (code example). For more information, please follow other related articles on the PHP Chinese website!