Go Iris 中间件

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 方法注册的中间件都被执行了。

原文地址:https://www.cnblogs.com/liyutian/p/10270935.html

时间: 2024-07-31 23:51:57

Go Iris 中间件的相关文章

Iris中间件使用

中间件介绍 中间件可以理解为框架的钩子,对所有的请求和响应进行拦截 简单的中间件Demo package main import ( "fmt" "github.com/kataras/iris" "strings" ) // 中间件小Demo func main() { app := iris.New() app.Get("/name/{name}",before,mainHandler,after) // before,

Iris jwt 使用

jwt分为三个部分: ? 1.header,用来存储算法和token类型等信息 ? 2.payload, 一些简单的信息 ? 3.签名,来验证token是否合法 iris-jwt 这是初始化jwt中间件的配置参数. type Config struct { ValidationKeyGetter jwt.Keyfunc // 用来设置请求中通过那个key获取Token,默认是 "jwt", user := ctx.Values().Get("jwt").(*jwt.

Golang Gin/Ace/Iris/Echo RBAC 鉴权库

GRBAC 项目地址: https://github.com/storyicon/grbac Grbac是一个快速,优雅和简洁的RBAC框架.它支持增强的通配符并使用Radix树匹配HTTP请求.令人惊奇的是,您可以在任何现有的数据库和数据结构中轻松使用它. grbac的作用是确保指定的资源只能由指定的角色访问.请注意,grbac不负责存储鉴权规则和分辨"当前请求发起者具有哪些角色",更不负责角色的创建.分配等.这意味着您应该首先配置规则信息,并提供每个请求的发起者具有的角色. grb

Iris路由和路由组

package main import ( "github.com/kataras/iris" "github.com/kataras/iris/context" ) func main() { app := iris.New() //1.handle方式处理请求 //同一用来处理请求的方法 //GET app.Handle("GET", "/userinfo", func(context context.Context) {

爬虫5 scrapy框架2 全站爬取cnblogs, scarpy请求传参, 提高爬取效率, 下载中间件, 集成selenium, fake-useragent, 去重源码分析, 布隆过滤器, 分布式爬虫, java等语言概念补充, bilibili爬视频参考

1 全站爬取cnblogs # 1 scrapy startproject cnblogs_crawl # 2 scrapy genspider cnblogs www.cnblogs.com 示例: # cnblogs_crawl/cnblogs_crawl/spiders/cnblogs.py import scrapy from cnblogs_crawl.items import CnblogsCrawlItem from scrapy.http import Request class

3月1日 大型网站系统与Java中间件实践 读后感

第二章:大型网站以及架构演进过程 db和应用服务器在一台机器上 数据库与应用分离 服务器走向集群,负载均衡,session问题 读写分离:数据复制,数据源的选择,搜索引擎其实就是一个读库,缓存(数据缓存,页面缓存) 分布式存储系统 专库专用,数据垂直拆分 水平拆分 拆分应用,服务化 中间件 第三章:构建Java中间件 JVM 垃圾回收与内存堆布局 java并发类,接口和方法 动态代理 反射 网络通信实现选择

python运维开发(二十)----models操作、中间件、缓存、信号、分页

内容目录 select Form标签数据库操作 models操作F/Q models多对多表操作 Django中间件 缓存 信号 分页 select Form标签补充 在上一节中我们可以知道Form标签有两个作用,一个做用户提交数据验证,一个是生成HTML标签 在生成HTML标签中可以生成select标签,select的选项数据我们可以在数据库中查询读取到. class UserType(models.Model): caption = models.CharField(max_length=1

网站的架构CS和中间件

C/S结构: Client/Server架构,即客户端/服务器架构.是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,需要安装客户端才可进行管理操作. 客户端和服务器端的程序不同,用户的程序主要在客户端,服务器端主要提供数据管理.数据共享.数据及系统维护和并发控制等,客户端程序主要完成用户的具体的业务. 开发比较容易,操作简便,但应用程序的升级和客户端程序的维护较为困难. 详细描述: http://baike.baidu.com/link?u

Django进阶(路由系统、中间件、缓存、Cookie和Session

路由系统 1.每个路由规则对应一个view中的函数 url(r'^index/(\d*)', views.index), url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage), url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}), 2.根据app对路由规则进行一次分类 rl(r'^web/',include('web.urls')), 1.每个路由规则对应