发布网友 发布时间:2022-04-11 07:11
共1个回答
热心网友 时间:2022-04-11 08:40
摘要公司的开发采用了 gateway 作为微服务的网关,笔者使用中发现,gateway 网关拦截 POST 请求的参数非常麻烦,百度了很多种方法,有的获取不到,有的被读取到了,但是在往下居然获取不到了,千辛万苦终于找到了比较好的方式,以下做个笔记相关坑过滤器中的 Body 只能被读取一次,读取后之后在就读取不到了(坑爹)由于异步问题,直接获取参数内容可能会为空,并且不同的 SpringBoot 版本,有的能获取到,有的获取不到(坑爹的异步)由于异步问题,参数采用消费的模式,一但被读取使用后,后续就将无法再次读取到最终处理方式思路先读取参数,并全局保存到 ServerWebExchange 中读取完成后,重新构建请求,解决只能读取一次的问题在下级过滤器中通过 ServerWebExchange 对象获取代码读取参数的过滤器首先在一步回调中读取参数,防止获取不到保存到 exchange 中重新构造请求,防止参数失效@Componentpublic class ReqPostBodyFilter implements Ordered, GlobalFilter { @Override public int getOrder() { return 1; } @SuppressWarnings("NullableProblems") @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest req = exchange.getRequest(); ServerHttpResponse res = exchange.getResponse(); String method = req.getMethodValue(); MediaType ct = req.getHeaders().getContentType(); if (HttpMethod.POST.matches(method) { return DataBuff咨询记录 · 回答于2021-11-26如果在拦截请求中,我想拦截post方式提交的方法怎么配置公司的开发采用了 gateway 作为微服务的网关,笔者使用中发现,gateway 网关拦截 POST 请求的参数非常麻烦,百度了很多种方法,有的获取不到,有的被读取到了,但是在往下居然获取不到了,千辛万苦终于找到了比较好的方式,以下做个笔记相关坑过滤器中的 Body 只能被读取一次,读取后之后在就读取不到了(坑爹)由于异步问题,直接获取参数内容可能会为空,并且不同的 SpringBoot 版本,有的能获取到,有的获取不到(坑爹的异步)由于异步问题,参数采用消费的模式,一但被读取使用后,后续就将无法再次读取到最终处理方式思路先读取参数,并全局保存到 ServerWebExchange 中读取完成后,重新构建请求,解决只能读取一次的问题在下级过滤器中通过 ServerWebExchange 对象获取代码读取参数的过滤器首先在一步回调中读取参数,防止获取不到保存到 exchange 中重新构造请求,防止参数失效@Componentpublic class ReqPostBodyFilter implements Ordered, GlobalFilter { @Override public int getOrder() { return 1; } @SuppressWarnings("NullableProblems") @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest req = exchange.getRequest(); ServerHttpResponse res = exchange.getResponse(); String method = req.getMethodValue(); MediaType ct = req.getHeaders().getContentType(); if (HttpMethod.POST.matches(method) { return DataBuff你好看下看能帮你解决问题吗