1. 函数验证中间键

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

目录结构:

-common

—filter.go

-main.go

filter.go文件代码:

  1. package common
  2. import (
  3. "net/http"
  4. )
  5. //声明一个新的数据类型(函数类型)
  6. type FilterHandle func(rw http.ResponseWriter, req *http.Request) error
  7. //拦截器结构体
  8. type Filter struct {
  9. //用来存储需要拦截的URI
  10. filterMap map[string]FilterHandle
  11. }
  12. //Filter初始化函数
  13. func NewFilter() *Filter {
  14. return &Filter{filterMap: make(map[string]FilterHandle)}
  15. }
  16. //注册拦截器
  17. func (f *Filter) RegisterFilterUri(uri string, handler FilterHandle) {
  18. f.filterMap[uri] = handler
  19. }
  20. //根据Uri获取对应的handle
  21. func (f *Filter) GetFilterHandle(uri string) FilterHandle {
  22. return f.filterMap[uri]
  23. }
  24. //声明新的函数类型
  25. type WebHandle func(rw http.ResponseWriter, req *http.Request)
  26. //执行拦截器,返回函数类型
  27. func (f *Filter) Handle(webHandle WebHandle) func(rw http.ResponseWriter, r *http.Request) {
  28. return func(rw http.ResponseWriter, r *http.Request) {
  29. for path, handle := range f.filterMap {
  30. if path == r.RequestURI {
  31. //执行拦截业务逻辑
  32. err := handle(rw, r)
  33. if err != nil {
  34. rw.Write([]byte(err.Error()))
  35. return
  36. }
  37. //跳出循环
  38. break
  39. }
  40. }
  41. //执行正常注册的函数
  42. webHandle(rw, r)
  43. }
  44. }

main.go文件代码:

  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "github.com/student/1330/common"
  6. )
  7. //Auth 统一验证拦截器,每个接口都需要提前验证
  8. func Auth(w http.ResponseWriter, r *http.Request) error {
  9. //这里添加的是你的验证层面的信息类似于一个中间键
  10. fmt.Println("我是验证层面的信息")
  11. return nil
  12. }
  13. //Check 执行正常业务逻辑
  14. func Check(w http.ResponseWriter, r *http.Request) {
  15. //执行正常业务逻辑
  16. fmt.Println("执行check!")
  17. }
  18. func main() {
  19. //1、过滤器
  20. filter := common.NewFilter()
  21. //注册拦截器
  22. filter.RegisterFilterUri("/check", Auth)
  23. //2、启动服务
  24. http.HandleFunc("/check", filter.Handle(Check))
  25. //启动服务
  26. http.ListenAndServe(":8083", nil)
  27. }