Iris 中间件

当我们在 iris 中讨论中间件时,我们讨论的是在HTTP请求生命周期中在主处理程序代码之前和/或之后的运行代码。

实现中间件功能,有下面这样两种方式:

方式一:

我们可以通过按顺序注册多个 handler 的方式来实现中间件的效果:

package main

import "github.com/kataras/iris"

func main() {
app := iris.New()
app.Get("/", before, mainHandler, after) login := app.Party("/login", loginHandler)
login.Get("/{name}", loginNameHandler) app.Run(iris.Addr(":9090"))
} func loginNameHandler(ctx iris.Context){
name := ctx.Params().Get("name")
println(name)
ctx.Next()
} func loginHandler(ctx iris.Context){
println("login")
ctx.Next()
} func before(ctx iris.Context){
println("before")
ctx.Next() //继续执行下一个handler,这本例中是mainHandler
} func mainHandler(ctx iris.Context){
println("mainHandler")
ctx.Next()
} func after(ctx iris.Context){
println("after")
ctx.Next()
}

访问 localhost:9090/输出结果:

before
mainHandler
after

访问 localhost:9090/login/zhangsan 输出结果:

login
zhangsan

方式二(全局中间件):

我们会注意到,访问 login 路径时的中间件代码并没有被执行。如果希望在全局范围内使用中间件,而不仅仅是针对某一个路径时,可以通过使用 UseDone 方法来为当前域名下的所有路由进行注册

func main() {
app := iris.New()
//注意 Use 和 Done 方法需要写在绑定访问路径的方法之前 //使用 ‘Use’ 方法作为当前域名下所有路由的第一个处理函数
//而使用 ‘UseGlobal’ 方法注册的中间件,会在包括所有子域名在内的所有路由中执行
app.Use(UseBefore)
app.Done(DoneAfter) app.Get("/", before, mainHandler, after)
login := app.Party("/login", loginHandler)
login.Get("/{name}", loginNameHandler) app.Run(iris.Addr(":9090"))
} func UseBefore(ctx iris.Context){
println("use - before")
ctx.Next()
} func DoneAfter(ctx iris.Context) {
println("Done - after")
ctx.Next()
}

访问 localhost:9090/ 输出结果:

use - before
before
mainHandler
after
Done - after

访问 localhost:9090/login/zhangsan 输出结果:

use - before
login
zhangsan
Done - after

可以看到通过 Use 和 Done 方法注册的中间件都被执行了。

最新文章

  1. HBASE基础知识
  2. stm32串口输出丢失第一个字符的问题及原因
  3. javascript生成对象的三种方法
  4. Unity内置的shader include files
  5. OpenGL(二)——函数库简述
  6. Python & Django 学习笔记
  7. 【Effective Java】4、覆盖equals时请遵守通用约定
  8. iOS7 和 iOS6的页面兼容问题
  9. (转)JSON数据格式和js操作json总结
  10. lighttpd mod_status模块
  11. laydate JS日期插件
  12. WordPress Simple Login Registration插件’username‘参数跨站脚本漏洞
  13. python 多线程一(lock)
  14. cpp(第九章)
  15. spring容器注入一个接口的两个实现类
  16. kubernetes实践之运行aspnetcore webapi微服务
  17. 【XSY2887】【GDOI2018】小学生图论题 分治FFT 多项式exp
  18. 2018-2019-1 20189203《Linux内核原理与分析》第八周作业
  19. Java并发编程:Java创建线程的三种方式
  20. R语言编程艺术#02#矩阵(matrix)和数组(array)

热门文章

  1. c# 图文添加文字斜水印 优化
  2. VS显示方法引用
  3. js之数据类型(对象类型——构造器对象——日期)
  4. 什么时候用assert
  5. 修改一张MyISAM表row_format为fixed为InnoDB表报错处理
  6. C和指针--链表
  7. 不重启linuxVMWare虚拟机添加虚拟光驱、硬盘
  8. Redis主从、哨兵、集群
  9. JavaScript捕获和冒泡探讨
  10. 生成漂亮报告的Go语言代码检查工具