首页 > 其他分享 >Golang Web--中间件的学习总结

Golang Web--中间件的学习总结

时间:2023-06-04 18:46:00浏览次数:45  
标签:Web http -- 中间件 HandlerFunc func return ResponseWriter

关于在golang中的中间件,可以翻阅笔者之前的博客,在这里不予详细说明。这里简单介绍下中间件的高级用法:

1.如果每个路由分别要配置多个中间价,该如何处理

2.如果有多个路由分别要配置多个中间件,该如何处理

3.尝试不定义结构体开发中间件

package main

import (
    "context"
    "fmt"
    "log"
    "net/http"
    "time"
)

type Middleware func(http.HandlerFunc) http.HandlerFunc

func GetAuthCode() Middleware {
    return func(f http.HandlerFunc) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
            code := 0
            if r.URL.Path != "/" {
                code = -1
            }
            ctxWithUser := context.WithValue(r.Context(), code, "User")
            rWithUser := r.WithContext(ctxWithUser)
            f(w, rWithUser)
        }
    }
}

func EnsureAuth() Middleware {
    return func(hf http.HandlerFunc) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
            user := r.Context().Value(0)
            if user != nil {
                log.Println("auth available")
            } else {
                http.Error(w, "please sign in", http.StatusUnauthorized)
                return
            }
            hf(w, r)
        }
    }
}

func Logging() Middleware {
    return func(hf http.HandlerFunc) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
            start := time.Now()
            defer func() {
                log.Println(r.URL.Path, time.Since(start))
            }()
            hf(w, r)
        }
    }
}

func Mehtod(m string) Middleware {
    return func(hf http.HandlerFunc) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
            if r.Method != m {
                http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
                return
            } else {
                log.Println("request:", m)
            }
            hf(w, r)
        }
    }
}
func Chain(f http.HandlerFunc, midddlewares ...Middleware) http.HandlerFunc {
    for _, m := range midddlewares {
        f = m(f)
    }
    return f
}

func Hello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello word")
}
func Auth(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "you have get auth")
}

func main() {
    http.HandleFunc("/", Chain(Hello, Mehtod("GET"), GetAuthCode(), Logging()))
    http.HandleFunc("/auth", Chain(Auth, Mehtod("GET"), GetAuthCode(), EnsureAuth(), Logging()))
    http.ListenAndServe(":7788", nil)
}

Hello,Auth是对两个路由的注册函数,其中Chain的参数包括handlefunc类型的函数,middleware类型的不定长参数,这里可以为每个路由指定多个路由中间件。

标签:Web,http,--,中间件,HandlerFunc,func,return,ResponseWriter
From: https://www.cnblogs.com/99kol/p/17456067.html

相关文章

  • 软件工程日报——个人总结
    今天,我想对自己进行一次个人总结1、回顾课程在我刚开始本学期的学习时,我写了一个开课博客,在博客中,我提到了本学期的目标:在保证软件工程不挂科的前提下,完成更多的安卓应用的开发,了解更多的软件知识,加强增删改查的练习;目标就是能够完成安卓应用的开发在结课之余,回顾这个学期的表......
  • 单节点kafka部署笔记
    1背景因为工作中需要对接kafka,准备在测试环境中自己部署一套,考虑方便决定部署一台单点。2部署2.1scala2.1.1java环境openjdk即可,我使用的是openjdk1.82.1.2下载软件下载scala-2.12.17.tgz并解压,例如解压到/home/scala/scala-2.12.172.1.3环境变量exportSCALA_HOME......
  • 【单元测试】Spring Data JPA + H2 测试DAO层
    1.环境配置Springboot2.7.8h22.1.2142.POM文件引入springbootparentpom点击查看代码<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.8</version......
  • 实验报告
    实验一-密码引擎-加密API一、研究资料API:应用程序接口(API:ApplicationProgramInterface)是一组定义、程序及协议的集合,通过API接口实现计算机软件之间的相互通信。API的一个主要功能是提供通用功能集。程序员通过使用API函数开发应用程序,从而可以避免编写无用程序,以减轻编......
  • 第五章 数组
    1.数组的概述‍1.1概念‍概念:是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。简称:多个数据的组合‍数组中的概念数组名下标(或索引)元素数组的长度​​‍数组的特点:数组本身是​引用数据类型​,而数组中的元......
  • 第六章 面向对象编程(基础)
    1.面向对象内容的三条主线Java类以及类的成员:属性,方法,构造器,代码块,内部类面向对象的特征:封装,继承,多态面向对象的关键字:this、super、package、import、static、final、interface、abstract等2.类和对象2.1类和对象概述‍类:具有相同特征的事务......
  • NOI / 1.9编程基础之顺序查找 05:最大值和最小值的差
    描述输出一个整数序列中最大的数和最小的数的差。输入第一行为M,表示整数个数,整数个数不会大于10000;第二行为M个整数,以空格隔开,每个整数的绝对值不会大于10000。输出输出M个数中最大值和最小值的差。样例输入525742样例输出5题意输入M,表示整数个数,再输入M个整......
  • 第七章 面向对象编程(进阶)
    1.this关键字‍1.1this的含义‍在Java中,this关键字不算难理解,它的作用和其词义很接近。它在方法(准确的说是实例方法或非static的方法)内部使用,表示调用该方法的对象它在构造器内部使用,表示该构造器正在初始化的对象。this可以调用的结构:成员变量、方法和构......
  • m基于节点位置偏好的自组织网络节点度分布的matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要​      移动自组织(AdHoc)网络是一种多跳的临时性自治系统,它的原型是美国早在1968年建立的ALOHA网络和之后于1973提出的PR(PacketRadio)网络。ALOHA网络需要固定的基站,网络中的每一......
  • android webview 使用以及一些常见的异常处理
    android中的提供webview控件,可以方便开发人员是自己的应用嵌入网页浏览功能,但实际开发中却会遇到一些问题,这个稍后会介绍到,效果图: 先来看个实例: 1.publicclassMainActivityextendsActivity{2.finalStringCOMPANY_WEB=;3.privateWebViewmWebView;4.......