我正在尝试构建一个示例Web应用程序,在后端使用rest演示go技术,提供基于json的请求和javascript,{{3在前端(我没有使用html/template
包)。
jquery "returns a handler that serves HTTP requests with the contents of the file system rooted at root."
说我正在发布包含static
和index.html
文件夹的scripts
文件夹,其中包含一些javascript
个文件。
如何阻止客户端查看我的js
文件(仅在index.html
发布/
)?
答案 0 :(得分:6)
您可以轻松地限制FileServer
,HttpHandler
,其中包含另一个HttpHandler
。例如,使用此包装器,它只允许提供*.js
个文件:
func GlobFilterHandler(h http.Handler, pattern string) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path
fileName := filepath.Base(path)
if ok, err := filepath.Match(pattern, fileName); !ok || err != nil {
if err != nil {
log.Println("Error in pattern match:", err)
}
http.NotFound(w, r)
return
}
h.ServeHTTP(w, r)
})
}
func main() {
fileHandler := http.FileServer(http.Dir("/tmp/dtest"))
wrappedHandler := GlobFilterHandler(fileHandler, "*.js")
}
您可以找到一篇博文here,其中介绍了非常好的基本构思。
您拥有的另一个选择是在http.Dir
上进行扩展并制作您自己的http.FileSystem
实现,它可以完全符合您的要求:
type GlobDir struct {
Dir http.Dir
Pattern string
}
func (d GlobDir) Open(name string) (http.File, error) {
baseName := filepath.Base(name)
if ok, err := filepath.Match(d.Pattern, baseName); !ok || err != nil {
if err != nil {
return nil, err
}
return nil, fmt.Errorf("%s not match GlobDir pattern.", baseName)
}
return d.Dir.Open(name)
}
func main() {
fileHandler := http.FileServer(GlobDir{
Dir: http.Dir("/tmp/dtest"),
Pattern: "*.js",
})
http.ListenAndServe(":8080", fileHandler)
}
第二个解决方案实现http.FileSystem
接受http.FileServer
接口。
它检查输入文件名是否与提供的模式匹配,然后将控制权交给原始http.Dir
。这可能就是你想去的地方。