Golang ECHO中间件【10】

摘要:
在echo框架中,中间件指的是可以拦截http请求响应生命周期的特殊功能。在请求-响应生命周期中,可以注册多个中间件。每个中间件执行不同的功能。在执行一个中间之后,执行下一个中间。中间件是嵌入在HTTP请求和响应之间的函数。它可以获取Echo#Context对象来执行一些特殊操作,例如记录每个请求或计算请求数。在所有中间件运行后处理操作。更多信息

在echo框架中中间件(Middleware)指的是可以拦截http请求-响应生命周期的特殊函数,在请求-响应生命周期中可以注册多个中间件,每个中间件执行不同的功能,一个中间执行完再轮到下一个中间件执行。

中间件是一个函数,嵌入在HTTP 的请求和响应之间。它可以获得 Echo#Context 对象用来进行一些特殊的操作, 比如记录每个请求或者统计请求数。

Action的处理在所有的中间件运行完成之后。

更多中间件参考官方文档golang echo:https://echo.labstack.com/middleware

中间件的常见应用场景如下:

  • 请求限速
  • api接口签名处理
  • 权限校验
  • 统一错误处理

提示:如果想拦截所有请求做一些事情都,可开发一个中间件函数去实现。

1.中间件级别

Root Level (Before router)

Echo#Pre() 用于注册一个在路由执行之前运行的中间件,可以用来修改请求的一些属性。比如在请求路径结尾添加或者删除一个’/‘来使之能与路由匹配。

下面的这几个内建中间件应该被注册在这一级别:

  • AddTrailingSlash
  • RemoveTrailingSlash
  • MethodOverride

注意: 由于在这个级别路由还没有执行,所以这个级别的中间件不能调用任何 echo.Context 的 API。

Root Level (After router)

大部分时间你将用到 Echo#Use() 在这个级别注册中间件。 这个级别的中间件运行在路由处理完请求之后,可以调用所有的 echo.Context API。

2.常用中间件

下面介绍echo自带的中间件

2.1. Redirect

HTTPS 重定向

HTTPS 重定向中间件将 http 请求重定向到 https。例如,http://laily.net 将被重定向到 https://laily.net。

用法

e := echo.New()
e.Pre(middleware.HTTPSRedirect())

HTTPS WWW 重定向

HTTPS WWW 重定向将 http 请求重定向到带 www 的 https 请求。例如,http://laily.net 将被重定向到 https://www.laily.net。

用法

e := echo.New()
e.Pre(middleware.HTTPSWWWRedirect())

HTTPS NonWWW 重定向

HTTPS NonWWW 将 http 请求重定向到不带 www 的 https 请求。例如,http://www.laily.net 将被重定向到 https://laily.net。

用法

e := echo.New()
e.Pre(middleware.HTTPSNonWWWRedirect())

WWW 重定向

WWW 重定向将不带 www 的请求重定向到带 www 的请求。

例如,http://laily.net 重定向到 http://www.laily.net

用法

e := echo.New()
e.Pre(middleware.WWWRedirect())

NonWWW 重定向

NonWWW 重定向将带 www 的请求重定向到不带 www 的请求。

例如,http://www.laily.net 重定向到 http://laily.net

用法

 e := echo.New()
 e.Pre(middleware.NonWWWRedirect())

2.2. Recover

Recover中间件,主要用于拦截panic错误并且在控制台打印错误日志,避免echo程序直接崩溃。
使用例子:

//初始化echo实例
e := echo.New()

//注册中间件
e.Use(middleware.Recover())

提示:一般echo应用都会注册Recover中间件,避免程序崩溃退出。

2.3. Static

Static中间件主要用于处理js、css之类的静态资源, 具体用法请参考: 处理静态文件。

2.4. Logger

Logger中间件主要用于打印http请求日志。

//初始化echo实例
e := echo.New()

//注册中间件
e.Use(middleware.Logger())

开启Logger中间件后,访问http请求会打印出日志:

2.5. Rewrite

url重定向中间,可以用于将一个url重定向到另外一个url。
例子:

//初始化echo实例
e := echo.New()

e.Pre(middleware.Rewrite(map[string]string{
  "/old":              "/new",   //将/old重定向至/new
  "/api/*":            "/$1",    
  "/js/*":             "/public/javascripts/$1",
  "/users/*/orders/*": "/user/$1/order/$2",
}))

/api/*代表任意字符串,$1 代表引用表达式中第一个*的匹配值, $2代表第二个,以此类推。

3.自定义中间件

下面以一个简单的统计访问量的例子介绍如何自定义中间件。

package main

import (
	"net/http"
	"github.com/labstack/echo"
)

//记录访问量
var totalRequests  = 0

//中间件函数
func Count(next echo.HandlerFunc) echo.HandlerFunc {
	return func(c echo.Context) error {
		//在这里处理拦截请求的逻辑
		//累计访问量
		totalRequests++
		
		//在响应头中输出访问量
		c.Response().Header().Add("requests", fmt.Sprintf("%d", totalRequests))

		//执行下一个中间件或者执行控制器函数, 然后返回执行结果
		return next(c)
	}
}

func main() {
	//初始化echo实例
	e := echo.New()
	//注册中间件
	e.Use(Count)
	
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")
	})
	
	e.Logger.Fatal(e.Start(":1323"))
}

4.自定义配置

用法

e := echo.New()
e.Use(middleware.HTTPSRedirectWithConfig(middleware.RedirectConfig{
  Code: http.StatusTemporaryRedirect,
}))

上面的示例将 HTTP 的请求重定向到 HTTPS,使用 307 - StatusTemporaryRedirect 状态码跳转。

配置

RedirectConfig struct {
  // Skipper defines a function to skip middleware.
  Skipper Skipper
  // Status code to be used when redirecting the request.
  // Optional. Default value http.StatusMovedPermanently.
  Code int `json:"code"`
}

默认配置

DefaultRedirectConfig = RedirectConfig{
  Skipper: defaultSkipper,
  Code:    http.StatusMovedPermanently,
}

免责声明:文章转载自《Golang ECHO中间件【10】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux audit审计(7-1)--读懂audit日志命令服务器linux中tftp服务器设置及测试,图解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Centos7 下安装golang

Centos7 下安装golang 1.下载安装包 下载地址:https://studygolang.com/dl本次下载 go1.12.5.linux-amd64.tar.gzwget https://studygolang.com/dl/golang/go1.12.5.linux-amd64.tar.gz 2. 解压到指定目录 tar -C /usr/...

emlog模板制作帮助手册

emlog基本模板文件 必须文件: main.css: CSS(样式表)文件 log_list.php: 日志列表页模板 echo_log.php: 日志页模板 page.php: 页面(page)模板 footer.php: Footer模板 header.php: Header模板 t.php: 碎语模板 module.php: 包含widgets、评...

Golang协程与通道整理

协程goroutine 不由OS调度,而是用户层自行释放CPU,从而在执行体之间切换。Go在底层进行协助实现 涉及系统调用的地方由Go标准库协助释放CPU 总之,不通过OS进行切换,自行切换,系统运行开支大大降低 通道channel 并发编程的关键在于执行体之间的通信,go通过通过channel进行通信 channel可以认为类似其他OS体系中的消息队列,...

第21课 微信支付:接口规则、参数设定规则、安全规范

文章说明: 本文是基于盛派网络苏震巍老师的《微信公众号+小程序快速开发》课程笔记。 课程地址: https://study.163.com/course/courseMain.htm?courseId=1004873017 本课项目地址: https://github.com/wechatdeveloper/WechatVideoCourse 课程目标:...

【IIS】设置URL重定向

名字解释:   URL转发分为隐含转发和非隐含转发,隐含转发就是指当前域名转发后,仍然显示当前域名,而非隐含转发者指当前域名转发后,显示被转发的地址。 前提:   你有一个A网站:地址是:192.168.1.223:8700                       B网站:地址是 www.baidu.com 现在要在输入A网站地址后,直接跳转到B网站中...

使用User-Agent防止HttpClient发送http请求时403 Forbidden和安全拦截

问题的抛出 今天有合作商户反映,批付交易完成后,在我方服务器以“服务器点对点通信”的方式通知请求对方服务器时,对方拦截了请求。并贴了一张截图。 从截图可以看出来,对方拦截了我们的user-agent(Apache-HttpClient)。 什么是User-Agent?通常我们用浏览器访问一个网页,当我们向服务器发送请求时,浏览器会将一些头信息附加上,然后发...