首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExceptionHandler WebFilter覆盖spring标头

ExceptionHandler WebFilter覆盖spring标头
EN

Stack Overflow用户
提问于 2018-12-20 21:04:04
回答 2查看 783关注 0票数 2

我同时使用了WebFilter和WebExceptionHandler。只有当ExceptionHandler没有设置它时,WebFilter才应该添加新的标头。但是,WebFilter是在ExceptionHandler被WebHttpHandler执行之前添加到ServerWebExchange中的,所以它无法判断ExceptionHandler是否被触发。

代码语言:javascript
复制
@Component
@Order(-2)
class MyErrorWebExceptionHandler(g: MyErrorAttributes, applicationContext: ApplicationContext, serverCodecConfigurer: ServerCodecConfigurer)
    : AbstractErrorWebExceptionHandler(g, ResourceProperties(), applicationContext) {

    init {
        super.setMessageWriters(serverCodecConfigurer.writers)
        super.setMessageReaders(serverCodecConfigurer.readers)
    }

    @Override
    override fun getRoutingFunction(errorAttributes: ErrorAttributes): RouterFunction<ServerResponse> {
        return RouterFunctions.route(RequestPredicates.all(), HandlerFunction<ServerResponse> { renderErrorResponse(it) })
    }

    private fun renderErrorResponse(request: ServerRequest): Mono<ServerResponse> {

        val errorPropertiesMap = getErrorAttributes(request, false)

        return ServerResponse.status(HttpStatus.OK)
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .headers { x ->
                        x.set(c_ApplicationStatus, errorPropertiesMap[c_ApplicationStatus].toString())
                      }.build()
}

@Component
class ServerResponseHeaderWebFilter : WebFilter {
    override fun filter(exchange: ServerWebExchange, chain: WebFilterChain): Mono<Void> {
        exchange.response.headers.set(c_ApplicationStatus, HttpStatus.OK.value().toString())
        return chain.filter(exchange)

    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-17 22:37:19

最后,我发现过滤器中设置的头可以在request.exchange()对象中看到。它必须在那里被删除,以便新的标头集替换它。

代码语言:javascript
复制
private fun renderErrorResponse(request: ServerRequest): Mono<ServerResponse> {

        val errorPropertiesMap = getErrorAttributes(request, false)

        request.exchange().response.headers.remove(c_ApplicationStatus)
        return ServerResponse.status(HttpStatus.OK)
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .headers { x -> x.set(c_ApplicationStatus, value) }
                .build()
}
票数 0
EN

Stack Overflow用户

发布于 2018-12-21 05:59:46

在这种情况下,我们可以快速建模执行顺序,如下所示:

代码语言:javascript
复制
WebFilter
|- setting the application status header to OK
|- calling chain.filter
   |- finding the handler and calling it
   |- in case of an error, the exception handler is called
|- after chain.filter

一旦过滤器链完成了交换,响应就已经被提交和处理,因此在这一点上没有办法更改响应头。使用此代码示例,如果执行异常处理程序,将重写web筛选器设置的任何标头。

所以从技术上讲,你的问题的答案是,一旦处理程序链处理了响应,就没有办法修改它。根据设计,这是Spring WebFlux的预期行为。

但听起来我们需要后退一步,谈谈你想要实现的目标。

在开发特性时,您是否正在尝试检查您的异常处理程序是否被调用?您是否正在尝试以某种目前不可能实现的方式调整Spring Boot中的错误处理机制?

如果你想谈谈你正在努力实现的目标,请提出另一个问题,这样用户就可以从这个问题中受益。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53869311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档