百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Go 语言 Web 框架 Echo 系列:基础篇—通过一个例子串联各特性

liuian 2025-05-08 02:46 75 浏览

通过前面的介绍,相信对 echo 有了一个初步的认识。本文我们通过一个简单的登录页面来串联 echo 的相关特性。因为该文主要关注各个特性,所以在目录结构和代码组织方面很随意。

本节最终效果

1)登录页面

2)登录失败

3)登录成功

main 函数骨架

使用 echo 框架,在程序入口处一般包含如下内容:

func main() {
 // 创建 echo 实例
 e := echo.New()

 // 配置日志
 configLogger(e)

 // 注册静态文件路由
 e.Static("img", "img")
 e.File("/favicon.ico", "img/favicon.ico")

 // 设置中间件
 setMiddleware(e)

 // 注册路由
 RegisterRoutes(e)

 // 启动服务
 e.Logger.Fatal(e.Start(":2019"))
}

日志

echo 中定义了一个接口:Logger,而 Echo 结构体有一个该接口的字段,这也就是 main 函数最后一句:e.Logger.Fatal 可以这么用的原因。框架中该接口的具体实现使用的是
github.com/labstack/gommon/log,如果需要,我们可以采用自己的实现,替换框架默认的。

默认情况下,日志输出到终端,而且 Level 级别是 ERROR,我们可以方便的通过 Logger 接口提供的方法进行修改:

func configLogger(e *echo.Echo) {
 // 定义日志级别
 e.Logger.SetLevel(log.INFO)
 // 记录业务日志
 echoLog, err := os.OpenFile("log/echo.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
 if err != nil {
  panic(err)
 }
 // 同时输出到文件和终端
 e.Logger.SetOutput(io.MultiWriter(os.Stdout, echoLog))
}

为了方便,开发中我将日志同时输出到了终端和文件中。

中间件

几乎所有的 Web 框架都支持中间件。其实这里的中间件跟传统的中间件不是一回事,这里的中间件其实是一种装饰模式。闲言少叙,我们看看 Echo 的中间件。

以 Recover 中间件为例讲解。

中间件标准签名

通过 Echo.Use 方法知晓,中间件是 MiddlewareFunc 类型,它的定义如下:

type MiddlewareFunc func(echo.HandlerFunc) echo.HandlerFunc

也就是说,一个中间件应该是 MiddlewareFunc 类型。所以,一个函数,只要返回 MiddlewareFunc 类型就是一个 Echo 中间件。

func Recover() echo.MiddlewareFunc {
  ...
}

支持配置的中间件

Echo 的中间件通常都支持以下功能:

  • 通过配置修改中间件的行为
  • 可以选择是否跳过该中间件

一般做法就是:

  • 定义一个类型,如:RecoverConfig,用于配置 Recover 中间件的行为;
  • 给上述类型的一个默认实例:DefaultRecoverConfig;
  • 定义一个支持传递配置的函数,返回中间件类型,如:RecoverWithConfig;
  • 定义一个不带参数的函数,返回中间件类型,内部调用带参数的中间件函数,参数用默认实例,如:Recover,它的实现是直接调用 RecoverWithConfig(DefaultRecoverConfig);

我们的例子代码中就通过配置修改了中间件行为:

// access log 输出到文件中
 accessLog, err := os.OpenFile("log/access.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
 if err != nil {
  panic(err)
 }
 // 同时输出到终端和文件
 middleware.DefaultLoggerConfig.Output = accessLog
 e.Use(middleware.Logger())

自己定义一个简单中间件

很多时候,我们业务的中间件,不需要那么灵活,没必要通过配置来控制行为,这时候可以像例子中的 AutoLogin 一样:

// AutoLogin 如果上次记住了,则自动登录
func AutoLogin(next echo.HandlerFunc) echo.HandlerFunc {
 return func(ctx echo.Context) error {
  cookie, err := ctx.Cookie("username")
  if err == nil && cookie.Value != "" {
   // 实际项目这里可以通过 username 读库获取用户信息
   user := &User{Username: cookie.Value}

   // 放入 context 中
   ctx.Set("user", user)
  }

  return next(ctx)
 }
}

接收一个 echo.HandlerFunc 类型,同时返回一个 echo.HandlerFunc 类型,这就是 MiddlewareFunc 的定义,因此 AutoLogin 可以直接当中间件使用。注意:在使用是这里和上面 Recover 的区别,Recover 是返回一个中间件,而 AutoLogin 本身是一个中间件,因此使用时分别是:Use(Recover()) 和 Use(AutoLogin)

在具体实现中间件时,可以在调用 next() 函数前后增加该中间件需要的功能。

Cookie 和 Session

关于 Cookie、Session 和 Token 的介绍,可以通过 《一文带您彻底理解Cookie、Session、Token》 :(
https://cloud.tencent.com/developer/article/1542456)了解下。

在 Go 中,Session 相关功能最常用的包是
github.com/gorilla/sessions。Echo 提供了 Session 中间件,使用的就是该包。这里我们主要讲解一下登录需要用到的功能。

登录成功种 Cookie

// 用标准库种 cookie
cookie := &http.Cookie{
  Name:     "username",
  Value:    username,
  HttpOnly: true,
}
if rememberMe == "1" {
  cookie.MaxAge = 7*24*3600 // 7 天
}
ctx.SetCookie(cookie)

我们这里直接使用了标准库的方式实现,而不是使用 ``
github.com/gorilla/sessions` 包。默认情况下,浏览器关闭,cookie 删除,当“记住我”,保存 7 天。这里留一个问题:
cookie.Expires 和 cookie.MaxAge 的区别?

重定向保留用户名

在登录失败后,为了避免用户再次输入用户名,这里借用
github.com/gorilla/sessions 包的 Flash Message 功能。


github.com/gorilla/sessions 实现了 Cookie 和文件系统 Session,默认情况下,使用 Cookie。

sess := getCookieSession(ctx)
sess.AddFlash(username, "username")
err := sess.Save(ctx.Request(), ctx.Response())

在读 Flash Message 的地方,一定要注意,需要再次执行 session.Save:

sess := getCookieSession(ctx)
if flashes := sess.Flashes("username"); len(flashes) > 0 {
  data["username"] = flashes[0]
}
sess.Save(ctx.Request(), ctx.Response())

总结

一个简单的登录,涉及到的知识点还是不少的,但依然有不少 Echo 框架的功能没包括。后面我们会介绍更多 Echo 的特性和功能,这个简单的例子,希望能够让你对 Echo 更有感觉。

完整示例代码:
https://github.com/polaris1119/echo-login-example

相关推荐

微软win7系统下载(微软官网window7下载)

因为你是按照名称排列的,试着修改一下排序方式,方法是:在桌面空白处右键,排序方式,修改日期这是因为大部分电脑用的都是GHOST系统,该系统在安装后都会向注册表写入自己的“私人信息”,如:风林火山GH...

xp10下载(Xp10下载破解版)

下载win10系统所需要的时间取决于很多因素。首先就是系统本身的大小,一般情况下,纯净版的系统在2.3个g左右,而有一些定制版的系统大小就不好说了,但是删减版的系统可以做到1.7个g左右,系统本身文件...

最强神级选择系统(无敌之最强神级选择系统)

8.自由高达《机动战士高达SEED》  7.V高达《机动战士高达V》  6.00高达《机动战士高达00》  5.独角兽高达《机动战士高达UC》  4.倒A高达《倒A高达》  3.V2高达《机动战士高...

惠普服务器售后电话客服热线

售后官网:https://support.hp.com/cn-zh/check-warranty该网站为惠普全新一站式服务支持平台,小惠将为您提供专业的技术解答和产品导购。同时提供全面的自助解决方案...

win10改成win7界面(win10改为win7界面)

1、首先我们打开你的电脑,选择打开左下角的开始菜单。2、打开后就选择设置按钮。3、打开之后就是这个页面往下拉,你就会看见更新,就是红圈圈里面,打开它。4、打开之后就是这个页面。5、然后我们在左侧选择恢...

win10系统怎么恢复系统还原(win10系统恢复怎么操作)

1、开机不断点击F8键,进入系统操作选单,选“最后一次正确配置”,重启电脑,看能否解决。2、开机不断点击F8键,进入系统操作选单,选“安全模式”,如能成功进入,依次单击“开始”→“所有程序”→“附件”...

怎么把电脑c盘格式化(怎么把c盘格式化吗)

1.在进行c盘格式化之前,必须备份重要的数据,以免数据丢失。2.在格式化c盘之前,确保所有的应用程序和系统文件都已经备份。否则,在进行格式化之后,将需要重新安装操作系统和所有的应用程序。3.如果...

中国移动赠送的wifi6路由器(192.168.10.1中国移动路由器)

移动tclwifi6路由器很好的。WiFi6路由器远强于WiFi5路由器,值得购买性价比不错。家庭生活中网速慢最主要的原因并非速率,而是穿墙效果。坐在离路由器很近的地方,手机网速一般不会有问题。...

office2010如何激活免费使用
  • office2010如何激活免费使用
  • office2010如何激活免费使用
  • office2010如何激活免费使用
  • office2010如何激活免费使用
win官网网址(win官方网站)

具体方法如下:打开电脑,在浏览器地址栏输入window,就会进入win中文官网,然后再寻找自己需要的软件,升级包等就可以了。下面是windows官网网址:1http://www.microsoft.c...

电脑的任务栏不见了怎么恢复
  • 电脑的任务栏不见了怎么恢复
  • 电脑的任务栏不见了怎么恢复
  • 电脑的任务栏不见了怎么恢复
  • 电脑的任务栏不见了怎么恢复
wifi网址登录入口(wifi网址登录入口有哪些)

wifi网页登录入口是网关地址192.168.1.1.1.首先检查路由器线路连接(参考前面手机设置路由器部分)2.将电脑Tnternet协议(TCP/IP)属性设置为“自动获取IP地址”和“自...

没有驱动程序怎么安装打印机

(1)启动电脑进入Windows操作系统,在桌面上单击开始-设置-打印机。(2)用鼠标右单击安装好的打印机图标,在弹出的右键菜单中选择属性,然后单击打印测试页按钮。(3)此时打印机会打出一页信息,从这...

u盘怎么取消写保护状态(u盘如何解除写保护状态)

如果您的U盘被设置为写保护,您可以尝试以下方法来关闭写保护:1.检查U盘上的物理开关:一些U盘上可能有一个物理开关,用于启用或禁用写保护。请检查U盘的外壳,看看是否有这样的开关,并将其切换到未锁定的...

压缩文件查看器(压缩文件查看器密码是多少)

1,打开手机上面的文件管理器,找到要压缩的WPS文件。2,长按一下WPS文件,然后选择要压缩的文件。3,点击右下角的【更多】,选择【压缩】。4,对压缩文件进行保存,压缩完成。扩展资料:wps产品特点1...