zoukankan      html  css  js  c++  java
  • Golang ECHO中间件【10】

    在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,
    }
    
  • 相关阅读:
    LeetCode 226. Invert Binary Tree
    LeetCode 221. Maximal Square
    LeetCode 217. Contains Duplicate
    LeetCode 206. Reverse Linked List
    LeetCode 213. House Robber II
    LeetCode 198. House Robber
    LeetCode 188. Best Time to Buy and Sell Stock IV (stock problem)
    LeetCode 171. Excel Sheet Column Number
    LeetCode 169. Majority Element
    运维工程师常见面试题
  • 原文地址:https://www.cnblogs.com/remixnameless/p/14318287.html
Copyright © 2011-2022 走看看