Spring Cloud Gateway鉴权或获取requestBody内容

本文深入探讨了如何在Spring Cloud Gateway中实现请求体的修改和鉴权功能,通过分析ModifyRequestBodyGatewayFilterFactory源码,揭示了处理和获取requestBody的详细步骤,为构建安全的API网关提供了关键指导。
摘要由CSDN通过智能技术生成

参考官方的:ModifyRequestBodyGatewayFilterFactory.java

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.factory.rewrite.CachedBodyOutputMessage;
import org.springframework.cloud.gateway.support.BodyInserterContext;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserter;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.HandlerStrategies;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.spr
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 `@ControllerAdvice` 中获取 requestbody 有多种方式,以下是其中两种常用的方式: 1. 使用 `HttpServletRequest` 对象获取请求的 body 可以使用 `HttpServletRequest` 对象获取请求的 body,然后再进行相应的处理。示例代码如下: ```java import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import javax.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.io.IOException; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public void handleException(HttpServletRequest request, Exception e) { String requestBody = getRequestBody(request); // 处理请求的 body } private String getRequestBody(HttpServletRequest request) { StringBuilder requestBody = new StringBuilder(); try (BufferedReader reader = request.getReader()) { String line; while ((line = reader.readLine()) != null) { requestBody.append(line); } } catch (IOException e) { // 处理异常 } return requestBody.toString(); } } ``` 2. 使用 `@RequestBody` 注解获取请求的 body 可以在 `@ControllerAdvice` 中定义一个参数为 `@RequestBody` 的入参来获取请求的 body。示例代码如下: ```java import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.context.request.ServletWebRequest; import org.springframework.web.context.request.WebRequest; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<Object> handleException(WebRequest request, @RequestBody String requestBody, Exception e) { // 处理请求的 body HttpHeaders headers = new HttpHeaders(); HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR; // 构建响应体 return new ResponseEntity<>(responseBody, headers, status); } } ``` 需要注意的是,使用第二种方式需要确保请求的 body 可以被读取,否则将会导致异常。同时,需要在 `@ControllerAdvice` 中添加 `@RestController` 注解才能正常返回响应体。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值