Spring cloud gateway 修改请求头、修改请求报文和参数校验等网关功能

本文介绍了在Spring Cloud Gateway中如何实现请求格式校验、请求头修改以及请求体的修改,包括增加traceId进行日志追踪,并详细阐述了构建过程和功能实现步骤。
摘要由CSDN通过智能技术生成

前言

在公司构建一个项目,统一建一套网关,现将网关的功能和构建过程介绍如下。

网关功能

1、校验请求格式
2、验证参数签名权限,修改请求头信息
3、修改请求体,增加traceId(便于日志追踪)

构建过程

使用spring-cloud-gateway 3.0.3包,集成到spring-boot 2.5.2

1、校验请求格式

@Component
public class RequestFilter implements GlobalFilter, Ordered {
   

	@Override
	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
   
		ServerHttpRequest request = exchange.getRequest();
		addOriginalRequestUrl(exchange, request.getURI());
		String rawPath = request.getURI().getRawPath();
		String newPath = "/" + Arrays.stream(StringUtils.tokenizeToStringArray(rawPath, "/"))
			.skip(1L).collect(Collectors.joining("/"));
		ServerHttpRequest newRequest = request.mutate()
			.path(newPath)
			.build();
		exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, newRequest.getURI());
		return chain.filter(exchange.mutate().request(newRequest.mutate().build()).build());
	}

	@Override
	public int getOrder() {
   
		return -1000; // 执行顺序,必须为负数,值越小执行顺序越靠前
	}

}

2、验证参数签名权限,修改请求头信息

@Slf4j
@Component
@AllArgsConstructor
public class AuthFilter implements GlobalFilter, Ordered {
   
	private final AuthProperties authProperties;
	private final ObjectMapper objectMapper;
	private final AntPathMatcher antPathMatcher = new AntPathMatcher();

	private RedisUtil redisUtil;

	@Override
	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
   
		String path = exchange.getRequest().getURI().getPath();
		if (FilterUtil.isSkip(path,authProperties,antPathMatcher)) {
   
			return chain.filter(exchange);
		}
		ServerHttpRequest req = exchange.getRequest();
		ServerHttpResponse res = exchange.getResponse();
		
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Gateway修改请求参数,可以使用Spring Cloud Gateway提供的一些过滤器来实现。具体步骤如下: 1. 创建一个过滤器类,继承AbstractGatewayFilterFactory类,实现filter方法,该方法用于修改请求参数。例如: ``` public class ModifyRequestBodyGatewayFilterFactory extends AbstractGatewayFilterFactory<ModifyRequestBodyGatewayFilterFactory.Config> { public ModifyRequestBodyGatewayFilterFactory() { super(Config.class); } @Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { // 获取请求参数 ServerHttpRequest request = exchange.getRequest(); Flux<DataBuffer> body = request.getBody(); MediaType contentType = request.getHeaders().getContentType(); Charset charset = contentType.getCharset() != null ? contentType.getCharset() : StandardCharsets.UTF_8; // 修改请求参数 String bodyStr = body.map(dataBuffer -> { byte[] bytes = new byte[dataBuffer.readableByteCount()]; dataBuffer.read(bytes); DataBufferUtils.release(dataBuffer); return new String(bytes, charset); }).reduce((s1, s2) -> s1 + s2).orElse(""); String modifiedBodyStr = modify(bodyStr); // 构造新的请求参数 byte[] newBodyBytes = modifiedBodyStr.getBytes(charset); DataBuffer newBodyBuffer = request.bufferFactory().wrap(newBodyBytes); // 构造新的请求对象 ServerHttpRequest newRequest = request.mutate().body(Mono.just(newBodyBuffer)).build(); // 继续执行后续过滤器链 return chain.filter(exchange.mutate().request(newRequest).build()); }; } private String modify(String body) { // 在此处实现修改请求参数的逻辑 return body; } public static class Config { // 配置参数 } } ``` 2. 在配置文件中配置过滤器,例如: ``` spring: cloud: gateway: routes: - id: modify_request_body_route uri: http://localhost:8080 predicates: - Path=/modifyRequestBody filters: - ModifyRequestBody=modifyRequestBodyFilter default-filters: - ModifyRequestBody=defaultModifyRequestBodyFilter ``` 其中,ModifyRequestBody为过滤器类的名称,modifyRequestBodyFilter和defaultModifyRequestBodyFilter为过滤器实例的名称,可以根据实际需求进行修改。 3. 在控制器中接收修改后的请求参数,例如: ``` @PostMapping("/modifyRequestBody") public String modifyRequestBody(@RequestBody String requestBody) { // 处理请求参数 return "success"; } ``` 在上述代码中,@RequestBody注解用于接收请求参数。如果请求参数已经被修改,那么控制器中接收到的参数就是修改后的参数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值