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)
}