golang基于iris框架拦截器怎么写?

方明驹 2019-07-29 07:23:09
在网上找了很多资料,但是都不是iris框架的,感觉这个框架就没有这个功能?有大神帮忙解决下吗?
...全文
435 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xss13 2019-08-15
  • 打赏
  • 举报
回复
这是我写的一个jwt拦截登录,实现不标准作为一个参考
xss13 2019-08-15
  • 打赏
  • 举报
回复
iris是有学习网站的,而且我觉得iris很强大的 https://www.studyiris.com/doc/index.html 这个是中文社区,推荐你去iris官网查阅文档。 拦截器实现: app := iris.Default() app.Use(func(c context.Context) { //如果该拦截器执行完必须要向下继续传递 defer c.Next() //拦截器的值向下传递 c.Values().Set("KEY","VALUE") //获取上一个拦截器的值 c.Values().Get("KEY","VALUE") //不希望拦截器继续,可直接ctx.JSON()等,并且去掉c.Next()函数即可 })
qybao 2019-07-30
  • 打赏
  • 举报
回复
看了一下iris源码,都有相应的接口,要实现并不难
Application结构体的Router和ContextPool都是可见的,根据情况自己实现相应的接口,重新设置一下Application的实例就可以
以下是Application的源码
// New creates and returns a fresh empty iris *Application instance.
func New() *Application {
config := DefaultConfiguration()

app := &Application{
config: &config,
logger: golog.Default,
APIBuilder: router.NewAPIBuilder(),
Router: router.NewRouter(),
}

app.ContextPool = context.New(func() context.Context {
return context.NewContext(app)
})

return app
}

思路:
返回app后,重新修改app.ContextPool = context.New(func() context.Context {
c := context.NewContext(app) //原来的Context实例
mc := &MyContext{c} //MyContext重新实现context.Context接口
return mc
})

//重新实现Context接口
type MyContext struct {
base_context context.Context //保存原来的Context实例
}
func (mc *MyContext) Do(Handlers) { //其他方法类似,你想在哪个方法加拦截就加拦截,不需要拦截器就直接调用原来的Context实例的方法
doYourFun() //加入你的拦截
mc.base_context(Handlers) //调用原来的Context实例的方法
}
//context.Context 的接口方法请参照源码
https://github.com/kataras/iris/blob/master/context/context.go

2,190

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • Freeman Z
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧