中间件

当我们在Iris中讨论中间件时,我们讨论的是在HTTP请求生命周期中在主处理程序代码之前和/或之后运行代码。例如,记录中间件可能会将传入的请求详细信息写入日志,然后在写入有关日志响应的详细信息之前调用处理程序代码。关于中间件的一个很酷的事情是这些单元非常灵活和可重用。

下面一个简单的示例

  1. package main
  2. import "github.com/kataras/iris"
  3. func main() {
  4. app := iris.New()
  5. app.Get("/", before, mainHandler, after)
  6. app.Run(iris.Addr(":8080"))
  7. }
  8. func before(ctx iris.Context) {
  9. shareInformation := "this is a sharable information between handlers"
  10. requestPath := ctx.Path()
  11. println("Before the mainHandler: " + requestPath)
  12. ctx.Values().Set("info", shareInformation)
  13. ctx.Next() //继续执行下一个handler,在本例中是mainHandler。
  14. }
  15. func after(ctx iris.Context) {
  16. println("After the mainHandler")
  17. }
  18. func mainHandler(ctx iris.Context) {
  19. println("Inside mainHandler")
  20. // take the info from the "before" handler.
  21. info := ctx.Values().GetString("info")
  22. // write something to the client as a response.
  23. ctx.HTML("<h1>Response</h1>")
  24. ctx.HTML("<br/> Info: " + info)
  25. ctx.Next() // 继续下一个handler 这里是after
  26. }

试试看:

  1. $ go run main.go # and navigate to the http://localhost:8080
  2. Now listening on: http://localhost:8080
  3. Application started. Press CTRL+C to shut down.
  4. Before the mainHandler: /
  5. Inside mainHandler
  6. After the mainHandler

全局使用中间件

  1. package main
  2. import "github.com/kataras/iris"
  3. func main() {
  4. app := iris.New()
  5. //将“before”处理程序注册为将要执行的第一个处理程序
  6. //在所有域的路由上。
  7. //或使用`UseGlobal`注册一个将跨子域触发的中间件。
  8. app.Use(before)
  9. //将“after”处理程序注册为将要执行的最后一个处理程序
  10. //在所有域的路由'处理程序之后。
  11. app.Done(after)
  12. // register our routes.
  13. app.Get("/", indexHandler)
  14. app.Get("/contact", contactHandler)
  15. app.Run(iris.Addr(":8080"))
  16. }
  17. func before(ctx iris.Context) {
  18. // [...]
  19. }
  20. func after(ctx iris.Context) {
  21. // [...]
  22. }
  23. func indexHandler(ctx iris.Context) {
  24. ctx.HTML("<h1>Index</h1>")
  25. ctx.Next() // 执行通过`Done`注册的“after”处理程序。
  26. }
  27. func contactHandler(ctx iris.Context) {
  28. // write something to the client as a response.
  29. ctx.HTML("<h1>Contact</h1>")
  30. ctx.Next() // 执行通过`Done`注册的“after”处理程序。
  31. }

探索与发现下面你可以看到一些有用的处理程序的源代码来学习

Middleware名称例子地址
basic authenticationbasicauth
Google reCAPTCHArecaptcha
ocalization and internationalizationi81n
request loggerrequest-logger
profiling (pprof)profiling (pprof)
recoveryrecovery

一些真正帮助您完成特定任务的中间件

Middleware名称描述例子地址
jwt中间件在传入请求的Authorization标头上检查JWT并对其进行解码。iris-contrib/middleware/jwt/_example
corsHTTP访问控制。iris-contrib/middleware/cors/_example
secure实现一些快速安全性的中间件获胜。iris-contrib/middleware/secure/_example
tollbooth用于限制HTTP请求的通用中间件。iris-contrib/middleware/tollbooth/_examples/limit-handler
cloudwatchAWS cloudwatch指标中间件。iris-contrib/middleware/cloudwatch/_example
new relic官方New Relic Go Agent。iris-contrib/middleware/newrelic/_example
prometheus轻松为prometheus检测工具创建指标端点 iris-contrib/middleware/prometheus/_example
casbin一个授权库,支持ACL,RBAC,ABAC等访问控制模型iris-contrib/middleware/casbin/_examples