GoWeb实现filter

在GoWeb里面我们要实现对uri进行拦截处理(拦截器),我们是通过http包里的HandleFunc方法,HandleFunc方法具体如下:

// HandleFunc registers the handler function for the given pattern
// in the DefaultServeMux.
// The documentation for ServeMux explains how patterns are matched.
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}

HandleFunc方法的第一个参数就是我们的uri,第二个参数就是处理uri的函数

首先我们声明了一个函数(FilterHandle)的数据类型,这个函数和HandleFunc的第二个参数进行对应;然后又声明了一个WebHandle数据类型,这样做的目的就是,如果我们对现有的uri没有拦截器,那么我们就对该uri执行正常的业务逻辑,这个里很关键,也是为了filter更通用。

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

//验证通过正常的业务处理逻辑
type WebHandle func(rw http.ResponseWriter,req *http.Request)

之后我们又声明了filter数据类型,里面声明一个map数据类型,key:就是uri,value是对uri进行处理的函数(FilterHandle);之后就是实例化filter,对参数做初始化。随后我们声明了拦截器的注册函数以及获取对应uri的处理拦截函数。

//拦截器结构体
type Filter struct {
    //用来存储拦截的URI,key uri,FilterHandle对uri进行拦截处理的函数
    filterMap map[string]FilterHandle
}

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

最后这里也是filter的核心代码,我们将注册到拦截器map给便利出来,找到相应uri的处理函数,对他进行处理,如果没有则执行正常的逻辑。

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 strings.Contains(r.RequestURI,path){ //字符串的包含函数
                //执行拦截业务逻辑
                err := handle(rw,r)
                if err != nil {
                    rw.Write([]byte(err.Error()))
                    return
                }
                break
            }
        }
        //执行正常注册的函数
        webHandle(rw,r)
    }
}

这个函数返回也是一个函数,为了和HandleFunc的第二个参数进行相互对应

运用拦截器对uri进行注册,相关代码如下:

    //1、过滤器
    filter := common.NewFilter()
    filter.RegisterFilterUri("/check",Auth)
    filter.RegisterFilterUri("/checkRight",Auth)
    //2、启动服务器
    http.HandleFunc("/check",filter.Handle(Check))
    http.HandleFunc("/checkRight",filter.Handle(CheckRight))

Auth就是拦截器处理函数,如果拦截器处理函数通过,就会执行下面的Check函数

整个流程就是通过HandleFunc函数对uri实行拦截的实例,希望对大家有所帮助。

你可能感兴趣的:(GoWeb实现filter)