## 中間件
中間件是一個函數,嵌入在HTTP 的請求和響應之間。它可以獲得 `Echo#Context` 對象用來進行一些特殊的操作,
比如記錄每個請求或者統計請求數。
Action的處理在所有的中間件運行完成之后。
### 中間件級別
#### Root Level (Before router)
`Echo#Pre()` 用于注冊一個在路由執行之前運行的中間件,可以用來修改請求的一些屬性。比如在請求路徑結尾添加或者刪除一個'/'來使之能與路由匹配。
下面的這幾個內建中間件應該被注冊在這一級別:
- AddTrailingSlash
- RemoveTrailingSlash
- MethodOverride
*注意*: 由于在這個級別路由還沒有執行,所以這個級別的中間件不能調用任何 `echo.Context` 的 API。
#### Root Level (After router)
大部分時間你將用到 `Echo#Use()` 在這個級別注冊中間件。
這個級別的中間件運行在路由處理完請求之后,可以調用所有的 `echo.Context` API。
下面的這幾個內建中間件應該被注冊在這一級別:
- BodyLimit
- Logger
- Gzip
- Recover
- BasicAuth
- JWTAuth
- Secure
- CORS
- Static
#### Group Level
當在路由中創建一個組的時候,可以為這個組注冊一個中間件。例如,給 admin 這個組注冊一個 BasicAuth 中間件。
*用法*
```go
e := echo.New()
admin := e.Group("/admin", middleware.BasicAuth())
```
也可以在創建組之后用 `admin.Use()`注冊該中間件。
#### Route Level
當你創建了一個新的路由,可以選擇性的給這個路由注冊一個中間件。
*用法*
```go
e := echo.New()
e.GET("/", <Handler>, <Middleware...>)
```