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,
    }
    
  • 相关阅读:
    linux 学习(二)防火墙
    linux学习(一)开始
    ajax和sap以及网络安全
    仿苹果导航菜单js问题
    基本类型和引用类型调用是的区别(Object.create)
    箴言
    思维的宽度
    笔记
    循环传值_闭包
    一个问题的解法(兔子三个月之后每月都生兔子的问题)
  • 原文地址:https://www.cnblogs.com/remixnameless/p/14318287.html
Copyright © 2011-2022 走看看