博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【玩转Golang】beego下实现martini中的透明式静态文件服务(static folder)效果。
阅读量:6192 次
发布时间:2019-06-21

本文共 2193 字,大约阅读时间需要 7 分钟。

  出于效率等原因,最近将web框架由切换为了,其他地方都很平顺,只是两个框架的handler签名不一致,需要修改,所以耗时较长,这是预计到的。但是有一个地方没有预计到,也耗费了较多时间,那就是静态文件的服务。

  用过martini的tx都知道,在mairtini中如果我们设置一个目录为静态文件目录,只需添加martini的Static插件,如设置web子目录为应用的静态文件路径:

m.Use(martini.Static("web"))

  此时,如果我们访问一个url,此url并没有在martini中注册,但是如果位于web目录中,就可以得到响应,例如:

http://127.0.0.1:8088/ //返回web目录下的index.htmlhttp://127.0.0.1:8088/ js/jquery.js//返回web/js/jquery.js

  但是,切换为beego之后,却没有找到这样的功能。发现beego对于静态文件的支持设计的有点不够友好,比如我进行如下设置

beego.SetStaticPath("/web", "web")

  这时候访问结果如下

http://127.0.0.1:8088/ //返回404页面http://127.0.0.1:8088/web//返回404页面http://127.0.0.1:8088/web/index.html//返回403 (Forbidden)http://127.0.0.1:8088/web/chat.html//返回正常http://127.0.0.1:8088/web/images/test.png//返回正常

  据此结果,有两点不满意:

  1. 必须添加该staticdir 映射的path访问,设置为“/” 无效
  2. 竟然不能返回默认页面!看文档需要设置”beego.DirectoryIndex=true“ ,不是我需要的!

  因此,我着手自己实现该需求。通过学习beego文档,发现可以设置Filter。于是,编写如下代码:

//main中如下设置filter beego.InsertFilter("/*", beego.BeforeRouter, TransparentStatic). . .func TransparentStatic(ctx *context.Context) {    defInd := 0    maxInd := len(defHomes) - 1    orpath := ctx.Request.URL.Path    beego.Debug(" in trasparentstatic filter orpath", orpath)    if strings.Index(orpath, "api/") >= 0 || strings.Index(orpath, "web/") >= 0 {        return    }DefaultStartPage:    p := orpath    if strings.EqualFold(p, "/") {        p += defHomes[defInd]        defInd++    }    ps := strings.Split(p, "/")    ps = append([]string{
"web"}, ps...) rp := strings.Join(ps, "/") fp := fw.MapPath(rp) beego.Debug("test fp", fp) if !fileutils.Exists(fp) { if defInd > 0 && defInd < maxInd { goto DefaultStartPage } return } else { beego.Debug("found static ", fp) http.ServeFile(ctx.ResponseWriter, ctx.Request, fp) //cannot use Redirect! will lead loop //http.Redirect(ctx.ResponseWriter, ctx.Request, rp, http.StatusFound) return } //}

  运行之后,发现访问服务地址,带不带末尾的"/",都不能返回默认页面,如果明确访问/index.html可以实现访问。后经探索发现,虽然beego说明中说"/*"可以适配所有url,但是实际上不能适配"/",因此需要在注册一个filter到”/":

beego.InsertFilter("/", beego.BeforeRouter, TransparentStatic) //must has this for default pagebeego.InsertFilter("/*", beego.BeforeRouter, TransparentStatic)

至此,一切正常了。

 

转载地址:http://aurda.baihongyu.com/

你可能感兴趣的文章
怎样使用SSH连接OpenStack上的云主机
查看>>
页面加载之window.onload=function(){} 和 $(function(){})的区别
查看>>
CHIL-SQL-UPDATE 语句
查看>>
安装sun-java5-jdk 提示"无法找到软件包sun-java5-jdk
查看>>
线程的属性和 线程特定数据 Thread-specific Data
查看>>
【转】编程的宗派
查看>>
编写在浏览器中不弹出警告的ActiveX控件
查看>>
Hadoop_17_MapRduce_案例2_实现用户手机流量统计(ReduceTask并行度控制)
查看>>
官方文档note很清楚的,
查看>>
一点 误删,
查看>>
人人都是 DBA(IX)服务器信息收集脚本汇编 (转)
查看>>
Out-of-Process iframes (OOPIFs)
查看>>
openvas的坑
查看>>
javascript 继承的实现
查看>>
Could not load the "defaultimg" image referenced from a nib in the bundle with identifier "com.abc"
查看>>
Mac OSX用终端检测文件的sha1值
查看>>
CodeIgniter源代码阅读(五)Hooks.php
查看>>
系统分析与设计学习笔记(一)
查看>>
复利计算1.0,2.0,3.0(java)
查看>>
[Android Pro] 关于BitmapFactory.decodeStream(is)方法无法正常解码为Bitmap对象的解决方法...
查看>>