解决 Mac 上 Gin 服务每次 Build 后都会弹出【你要应用程序“main”接受传入网络连接吗?】

Windows 上也有同样的问题,会弹出允许应用通过防火墙/网络的弹窗,非常烦人

发布于  星期四,三月 21 2024

在学 Gin 的时候,发现每次修改完代码重新启动服务的时候,不管是在 Mac 还是在 Windows 上,都会弹窗,让你允许 ”main“xxx 什么的,只不过两个平台的弹窗表现不一样。这个弹窗非常烦人,我就想着怎么才能不让它弹这个窗,经过一番 Google,解决了,这里做个记录。

烦人的弹窗

Mac上

gin-main-warning.webp

Windows上

window-warning.webp

问题原因

后来我在Gin的这个issue下找到问题的答案,解释了原因——使用0.0.0.0(0.0.0.0代表本机上任何IP地址)时,会触发防火墙

reason-gin.webp

我们来看看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地址而导致出现弹窗的,问题就好解决了。

  1. 手动修改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(),默认监听服务器全部地址。因为localhost127.0.0.1都是本地地址,部署到服务器还是需要使用服务器的IP地址的(PS:个人愚见,没验证过)

  1. 直接把电脑的防火墙全关了,不推荐🙈
  2. 还有一种方法是需要在本地生成什么证书来着,这个太麻烦了我没细看,不推荐🙈
  • Golang
  • Gin