1月12号,原本是项目发版的时间,看着多少还有点不美观的页面,一直在调整样式,想不到在当晚发布的时候,好几个bug才对我动手了。。。一直跟同事检查和修复到1点才发布成功。
以下是各个坑的描述和解决方案,截图是本机演示,仅供参考~。
问题1 启动提示redis连接失败
第一次打包,把编译好的二进制直接拿去发版。没经验,以为这会是一个胖二进制,结果无论如何检查配置打包的效果都不能正确使用配置中的redis参数启动:
于是将几个配置yml附上,放在二进制同级目录下。重启应用
redis的问题解决。
问题2 模板缺失
出现了新的错误提示,如图
判断是无法访问template下的相关模板资源,通过对比源码文件夹和实际打包产物的大小,发现打包较小,估计是只能打包go代码,而配置、静态资源全部需要拷贝一份。
于是将assert资源上传。按对应文件夹放好,成功启动:
问题3 cookie不能正常获取,导致登录后无法访问首页
铺垫:首页是获取前端请求带的一个“session_id”头拿到会话数据,进一步取到该会话在登录成功时存放的一个token串来做鉴权。前端传入gin返回的有效的session_id即可访问需要权限的页面。若拿不到cookie中的sessionid数据,或无效sessionid则返回登录页,同时会写新建的sessionId值到前端。
会话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中文社区
网上建议:不直接写到域: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
}
cookie正常写回到浏览器!可以跳转首页了!成功解决已经是凌晨1点~
码字不容易,多多少少点个赞吧^_^