gin项目(含模板静态资源)发布踩坑备忘录

1月12号,原本是项目发版的时间,看着多少还有点不美观的页面,一直在调整样式,想不到在当晚发布的时候,好几个bug才对我动手了。。。一直跟同事检查和修复到1点才发布成功。

以下是各个坑的描述和解决方案,截图是本机演示,仅供参考~。

问题1 启动提示redis连接失败

第一次打包,把编译好的二进制直接拿去发版。没经验,以为这会是一个胖二进制,结果无论如何检查配置打包的效果都不能正确使用配置中的redis参数启动:

gin项目(含模板静态资源)发布踩坑备忘录

于是将几个配置yml附上,放在二进制同级目录下。重启应用

gin项目(含模板静态资源)发布踩坑备忘录

 redis的问题解决。

问题2 模板缺失

出现了新的错误提示,如图

gin项目(含模板静态资源)发布踩坑备忘录

 判断是无法访问template下的相关模板资源,通过对比源码文件夹和实际打包产物的大小,发现打包较小,估计是只能打包go代码,而配置、静态资源全部需要拷贝一份。

于是将assert资源上传。按对应文件夹放好,成功启动:

gin项目(含模板静态资源)发布踩坑备忘录

 问题3 cookie不能正常获取,导致登录后无法访问首页

铺垫:首页是获取前端请求带的一个“session_id”头拿到会话数据,进一步取到该会话在登录成功时存放的一个token串来做鉴权。前端传入gin返回的有效的session_id即可访问需要权限的页面。若拿不到cookie中的sessionid数据,或无效sessionid则返回登录页,同时会写新建的sessionId值到前端。

gin项目(含模板静态资源)发布踩坑备忘录

 会话id会写到前端cookie

//回写cookie
c.SetCookie(SessionCookieName, sd.GetID(), 3600, "/", "localhost", false, true)

结合 登录成功 -> 写sessionid到cookie -> 获取cookie中sessionid ->使用或新建sessionid ->首页获取cookie解析session数据 的流程,若cookie写入正常,则应该能跳转首页。

而验证时发现 ,登录成功后又跳回登录页,一直死循环,而非鉴权页面则正常访问。经排查,始终无法找到cookie:session_id的字段

在本机开发时,一直没有发现该问题,部署发版时这才重现!用我同事电脑访问我本机所部署程序,这才重现了!兴许,是cookie域的问题 ?带着这个问题继续上网求助

1. 博客:gin设置获取cookie【设置不成功】 - Go语言中文网 - Golang中文社区

gin项目(含模板静态资源)发布踩坑备忘录

网上建议:不直接写到域:127.0.0.1和0.0.0.0

2. 是否需要结合实际部署ip来写cookie?

带着这个思考,借鉴网上写了个工具,用于获取本机ip和请求者ip,直接写到所有可能的ip 里:


func GetLocalIP() []string {
	var ipStr []string
	netInterfaces, err := net.Interfaces()
	if err != nil {
		fmt.Println("net.Interfaces error:", err.Error())
		return ipStr
	}

	for i := 0; i < len(netInterfaces); i++ {
		if (netInterfaces[i].Flags & net.FlagUp) != 0 {
			addrs, _ := netInterfaces[i].Addrs()
			for _, address := range addrs {
				if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
					//获取IPv6
					/*if ipnet.IP.To16() != nil {
					    fmt.Println(ipnet.IP.String())
					    ipStr = append(ipStr, ipnet.IP.String())

					}*/
					//获取IPv4
					if ipnet.IP.To4() != nil {
						fmt.Println(ipnet.IP.String())
						ipStr = append(ipStr, ipnet.IP.String())

					}
				}
			}
		}
	}
	return ipStr

}

// GetRequestIP 获取ip
func GetRequestIP(c *gin.Context) string {
	reqIP := c.ClientIP()
	if reqIP == "::1" {
		reqIP = "127.0.0.1"
	}
	return reqIP
}

gin项目(含模板静态资源)发布踩坑备忘录

 cookie正常写回到浏览器!可以跳转首页了!成功解决已经是凌晨1点~

码字不容易,多多少少点个赞吧^_^

上一篇:从零开发区块链应用(四)--自定义业务错误信息


下一篇:【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(一)