1. 函数验证中间键

本章节介绍的是使用原生的手法自定义一个函数验证的中间键!

目录结构:

-common

--filter.go

-main.go

filter.go文件代码:

package common

import (
    "net/http"
)

//声明一个新的数据类型(函数类型)
type FilterHandle func(rw http.ResponseWriter, req *http.Request) error

//拦截器结构体
type Filter struct {
    //用来存储需要拦截的URI
    filterMap map[string]FilterHandle
}

//Filter初始化函数
func NewFilter() *Filter {
    return &Filter{filterMap: make(map[string]FilterHandle)}
}

//注册拦截器
func (f *Filter) RegisterFilterUri(uri string, handler FilterHandle) {
    f.filterMap[uri] = handler
}

//根据Uri获取对应的handle
func (f *Filter) GetFilterHandle(uri string) FilterHandle {
    return f.filterMap[uri]
}

//声明新的函数类型
type WebHandle func(rw http.ResponseWriter, req *http.Request)

//执行拦截器,返回函数类型
func (f *Filter) Handle(webHandle WebHandle) func(rw http.ResponseWriter, r *http.Request) {
    return func(rw http.ResponseWriter, r *http.Request) {
        for path, handle := range f.filterMap {
            if path == r.RequestURI {
                //执行拦截业务逻辑
                err := handle(rw, r)
                if err != nil {
                    rw.Write([]byte(err.Error()))
                    return
                }
                //跳出循环
                break
            }
        }
        //执行正常注册的函数
        webHandle(rw, r)
    }
}

main.go文件代码:

package main

import (
    "fmt"
    "net/http"

    "github.com/student/1330/common"
)

//Auth 统一验证拦截器,每个接口都需要提前验证
func Auth(w http.ResponseWriter, r *http.Request) error {
    //这里添加的是你的验证层面的信息类似于一个中间键
    fmt.Println("我是验证层面的信息")
    return nil
}

//Check 执行正常业务逻辑
func Check(w http.ResponseWriter, r *http.Request) {
    //执行正常业务逻辑
    fmt.Println("执行check!")
}
func main() {
    //1、过滤器
    filter := common.NewFilter()
    //注册拦截器
    filter.RegisterFilterUri("/check", Auth)
    //2、启动服务
    http.HandleFunc("/check", filter.Handle(Check))
    //启动服务
    http.ListenAndServe(":8083", nil)
}

results matching ""

    No results matching ""