解决 Mac 上 Gin 服务每次 Build 后都会弹出【你要应用程序“main”接受传入网络连接吗?】
Windows 上也有同样的问题,会弹出允许应用通过防火墙/网络的弹窗,非常烦人
发布于 星期四,三月 21 2024
在学 Gin 的时候,发现每次修改完代码重新启动服务的时候,不管是在 Mac 还是在 Windows 上,都会弹窗,让你允许 ”main“xxx 什么的,只不过两个平台的弹窗表现不一样。这个弹窗非常烦人,我就想着怎么才能不让它弹这个窗,经过一番 Google,解决了,这里做个记录。
烦人的弹窗
Mac上
Windows上
问题原因
后来我在Gin
的这个issue下找到问题的答案,解释了原因——使用0.0.0.0
(0.0.0.0代表本机上任何IP地址)时,会触发防火墙
我们来看看Gin
是怎么启动服务的,下面是来自Gin文档-快速入门的一段代码
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
可以看到r.Run()
函数后有一段注释——”监听并在 0.0.0.0:8080 上启动服务“。Gin
默认帮我们设置的监听是0.0.0.0
地址,而监听0.0.0.0
地址时会触发防火墙策略,所以出现了弹窗,要我们允许xxx
这篇文章也提到了解决方案MAC上使用air时,每次重新build之后都会弹出“您要应用程序“main”接受传入网络连接吗?” ,但是并没有解释为什么换成127.0.0.1
就能行了
Gin
底层肯定用的还是Go的http
包里的ListenAndServe
方法来启动的。
所以在使用原生的http
包启动服务时,也会出现上述的问题
// ...省略代码
http.ListenAndServe(":8080", nil) // 监听的是0.0.0.0:8080,也会弹窗
// ...省略代码
// 可以改成
http.ListenAndServe("localhost:8080", nil)
解决办法
知道了是因为默认监听的是0.0.0.0
地址而导致出现弹窗的,问题就好解决了。
- 手动修改
Gin
监听的地址为localhost
或者127.0.0.1
。在Run函数内我们这样写
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run("localhost:8080") // 监听并在 localhost:8080 上启动服务
// 或者
// r.Run("127.0.0.1:8080") // 监听并在 127.0.0.1:8080 上启动服务
}
注:如果需要部署在服务器上,可能还是需要r.Run()
,默认监听服务器全部地址。因为localhost
和127.0.0.1
都是本地地址,部署到服务器还是需要使用服务器的IP地址的(PS:个人愚见,没验证过)
- 直接把电脑的防火墙全关了,不推荐🙈
- 还有一种方法是需要在本地生成什么证书来着,这个太麻烦了我没细看,不推荐🙈
- Golang
- Gin