在 Ktor 中向路由添加拦截器不起作用

Posted

技术标签:

【中文标题】在 Ktor 中向路由添加拦截器不起作用【英文标题】:Adding interceptor to routes in Ktor not working 【发布时间】:2022-01-13 15:55:07 【问题描述】:

我有一个Route,对于每个ApplicationCall,我想在响应中添加一个标头。

例如

routes 
   route("/cdn-cached") 
        intercept(ApplicationCallPipeline.Features)
           call.response.header(HttpHeaders.CacheControl, ...)
        
        

        get(...) ...
        post(...) ...
        route(...) ...
   

这是我设置的一个过于简单的示例,但我期望的是,每次我调用 /cdn-cached 路由下的端点时,它都会附加标头。我确定我搞砸了,但我不知道是什么。

我需要什么来修复此代码?

注意:我有一个框架可以做很多动态的事情,到目前为止它可以做我想做的一切,现在我偶然发现了这个。我之所以这么说,是因为在每个 ApplicationCall 中添加标题对我来说不是一个好选择,比如这里的 get、post 和 route。我可以这样做,但如果我可以像我在示例中描述的那样做的话,我宁愿不这样做。

【问题讨论】:

【参考方案1】:

你可以拦截ApplicationCallPipeline.Call阶段来影响当前路由及其子路由:

route("/cdn-cached") 
    intercept(ApplicationCallPipeline.Call) 
        call.response.header("custom", "123")
    

    // ...

【讨论】:

谢谢!这似乎可以解决问题,但是在文档中它说像我这样的东西应该可以工作:ktor.io/docs/… 或者我误解了什么? 我已经更新了答案。无需拦截所有子路由。 这很奇怪,它可以在正常设置下工作,但在我的框架中,当我动态添加它时却不行。

以上是关于在 Ktor 中向路由添加拦截器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 中向模型添加错误不起作用

反应:通过状态钩子在 loginHandler 函数中向 localStorage 添加令牌不起作用

在 ng-repeat 中向 ng-click 函数添加参数似乎不起作用

使用 freemarker 自托管的 ktor 网站不起作用

shiro添加注解@RequiresPermissions不起作用

拦截器在 Spring Boot GraphQL 中不起作用