我正在尝试构建一个演示 rest 的示例 Web 应用程序使用 go 的技巧在后端,服务 json基于请求和 javascript , jquery在前端(我没有使用 html/template
包)。
FileServer “返回一个处理程序,该处理程序使用以根为根的文件系统的内容为 HTTP 请求提供服务。”
假设我正在发布我的 static
文件夹,其中包含 index.html
和 scripts
文件夹,其中包含一些 javascript
文件。
如何防止客户端查看我的 js
文件(仅在 /
发布 index.html
)?
最佳答案
您可以轻松地限制 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.FileServer
接受的http.FileSystem
接口(interface)。
它检查输入文件名是否与提供的模式匹配,然后将控制权交给原始的 http.Dir
。这可能是您想要前往此处的方式。
关于http - 使用文件服务器为我的单个 html 页面提供服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19255978/