写一个只允许一个域名下的用户访问的中间件,通过HTTP的HOSTheader实现。这样的中间件可以防止主机欺骗攻击。
定义一个结构
type SingleHost struct {
//处理请求
handler http.Handler
//可用host
allowHost string
}
如果是可用的host,嵌入handler,如果handler,则给出错误信息
通过 实现ServeHTTP来实现http.Handler
func (c *SingleHost)ServeHTTP(w http.ResponseWriter,r *http.Request){
//println("rHost:",r.Host)
//println("allowHost:",c.allowHost)
if r.Host==c.allowHost{
c.handler.ServeHTTP(w,r)
}else{
w.WriteHeader(403)
}
}
定义自己的handler函数处理自己的业务逻辑
func myHandler(w http.ResponseWriter,r *http.Request){
w.Write([]byte("\nHello,world"))
//fmt.Println(r.Host)
//w.WriteHeader(1)
}
使用http.ListenAndServe函数构建http服务
func main(){
single:=&SingleHost{
http.HandlerFunc(myHandler),
"sample.com",
}
http.ListenAndServe("127.0.0.1:8080",single)
}
go bulid main.go
运行程序
打开git命令行,输入curl --head 127.0.0.1:8080
访问127.0.0.1:8080
请求没有响应,因为可用host为sample.com,而http服务器监听127.0.0.1:8080,只有127.0.0.1:8080才能访问到服务器
把定义的SingleHost的allowHost改成127.0.0.1:8080后,
成功返回http头信息,访问127.0.0.1:8080
访问成功,这样实现了一个简单的http中间件