解决beego根目录不能访问静态文件的问题

三月 06, 2019 | views
Comments 0

beego可算是Go框架里面文档最多的了。学起来比较容易。但是框架自身的局限性却带了不小的问题。

最近我在处理flash跨域问题上就遇到个活生生的例子:

flash里面的as3访问外网时没啥问题。可是假如通过网页调取的情况下,flash访问的外网又与所在网页不是一个域的。就会产生跨域问题。打开浏览器,f12之后,看到的就是flash没有访问你的url,而是访问了这个url所在的域名根目录下的配置文件crossdomain.xml。该配置文件来设置跨域访问的权限。

这时候需要在你的域名根目录下放个crossdomain.xml文件。恰巧我用的是beego,不支持这功能!~

解决办法:

既然不支持那就把beego写成一个文件服务器的功能即可。把我的crossdomain.xml同样放到static下,在收到这个请求时,直接将这个文件写回到response即可。上代码:

  1. package main 
  2. import ( 
  3. "fmt" 
  4. http "net/http" 
  5. "path/filepath" 
  6. "strings" 
  7.  
  8.  
  9. "github.com/astaxie/beego" 
  10.  
  11.  
  12. type MainController struct { 
  13. beego.Controller 
  14.  
  15.  
  16. func (this *MainController) Get() { 
  17. //this.Ctx.Request.URL= http://127.0.0.1/crossdomain.xml 
  18. orpath := this.Ctx.Request.URL.Path 
  19.  
  20. if strings.Index(orpath, "crossdomain.xml") >= 0 { 
  21. fmt.Println(orpath) // /crossdomain.xml 
  22.  
  23. path := filepath.Join(`static`, "crossdomain.xml"
  24.  
  25. http.ServeFile(this.Ctx.ResponseWriter, this.Ctx.Request, path) 
  26.  
  27. this.Ctx.WriteString("hello world" + orpath) 
  28.  
  29.  
  30.  
  31. func (this *MainController) Post() { 
  32. name := this.GetString("name"
  33. sex := this.GetString("sex"
  34. this.Ctx.WriteString(name + sex+"成功"
  35. fmt.Println(name + sex) 
  36.  
  37.  
  38. func main() { 
  39.  
  40. beego.Router("/*", &MainController{}) 
  41. beego.Run() 

当然了这不是什么好办法。只是抛砖引玉而已。所有的请求都要判断一下,如果想完善一下,在路由配置时可以精确匹配url处理的controller就好了,而对于自己的controller就会没有影响了。



zend