Home > Java > javaTutorial > Introduction to context value passing of context (code example)

Introduction to context value passing of context (code example)

不言
Release: 2018-10-18 15:25:41
forward
3240 people have browsed it

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)))
    }
}
Copy after login

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!

Related labels:
source:segmentfault.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template