《本文參考地址》
分開寫法
RequestGlobalFilter.java
package com.makeit.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
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.util.StringUtils;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.net.URI;
import java.nio.charset.StandardCharsets;
/**
* RequestFilter
*/
@Component
@Slf4j
public class RequestGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
URI URIPath = request.getURI();
String path = request.getPath().value();
String method = request.getMethodValue();
HttpHeaders header = request.getHeaders();
String requestParams = String.valueOf(request.getQueryParams());
log.info("***********************************請求信息**********************************");
log.info("URI = {}", URIPath);
log.info("path = {}", path);
log.info("header = {}", header);
log.info("params = {}", requestParams);
//文件上傳不做處理
String contentType = header.getFirst("content-type");
if (StringUtils.hasLength(contentType) && contentType.contains("multipart/form-data")) {
return chain.filter(exchange);
}
//獲取requestBody
if (header.getContentLength() > 0) {
return DataBufferUtils.join(exchange.getRequest().getBody()).flatMap(dataBuffer -> {
byte[] bytes = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(bytes);
String bodyString = new String(bytes, StandardCharsets.UTF_8);
log.info("requestBody = {}", bodyString);
exchange.getAttributes().put("POST_BODY", bodyString);
DataBufferUtils.release(dataBuffer);
Flux<DataBuffer> cachedFlux = Flux.defer(() -> Mono.just(exchange.getResponse().bufferFactory().wrap(bytes)));
ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) {
@Override
public Flux<DataBuffer> getBody() {
return cachedFlux;
}
};
log.info("****************************************************************************\n");
return chain.filter(exchange.mutate().request(mutatedRequest).build());
});
}
log.info("****************************************************************************\n");
return chain.filter(exchange);
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
ResponseGlobalFilter.java文章來源:http://www.zghlxwxcb.cn/news/detail-602593.html
import lombok.extern.slf4j.Slf4j;
import org.reactivestreams.Publisher;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.nio.charset.StandardCharsets;
/**
* ResponseFilter
*/
@Slf4j
@Component
public class ResponseGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//獲取response的 返回數(shù)據(jù)
ServerHttpRequest originalRequest = exchange.getRequest();
ServerHttpResponse originalResponse = exchange.getResponse();
DataBufferFactory bufferFactory = originalResponse.bufferFactory();
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
Flux<? extends DataBuffer> fluxBody = Flux.from(body);
body = fluxBody.buffer().map(dataBuffers -> {
DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
DataBuffer join = dataBufferFactory.join(dataBuffers);
byte[] content = new byte[join.readableByteCount()];
join.read(content);
String responseData = new String(content, StandardCharsets.UTF_8);
log.info("***********************************響應信息**********************************");
// log.info("請求內(nèi)容:{}", originalRequest);
log.info("響應內(nèi)容:{}", responseData);
log.info("****************************************************************************\n");
DataBufferUtils.release(join);
//修改返回內(nèi)容,返回內(nèi)容是JSON字符串
//byte[] uppedContent = responseData.getBytes();
//return bufferFactory.wrap(uppedContent);
return bufferFactory.wrap(content);
});
return super.writeWith(body);
}
};
return chain.filter(exchange.mutate().response(decoratedResponse).build());
}
@Override
public int getOrder() {
//-1是響應寫入過濾器,必須在此之前調(diào)用,因此return必須小于或等于-2。
return -2;
}
}
合并寫法
RequestAndResponseGlobalFilter.java文章來源地址http://www.zghlxwxcb.cn/news/detail-602593.html
@Slf4j
@Component
public class RequestGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String path = request.getPath().value();
String method = request.getMethodValue();
HttpHeaders header = request.getHeaders();
String requestParams = String.valueOf(request.getQueryParams());
AtomicReference<String> requestBody = new AtomicReference<>("");
log.info("***********************************請求信息**********************************");
log.info("URI = {}", URIPath);
log.info("path = {}", path);
log.info("header = {}", header);
log.info("requestParams = {}", requestParams);
String contentType = header.getFirst("content-type");
if (StringUtils.hasLength(contentType) && contentType.contains("multipart/form-data")) {
return chain.filter(exchange);
}
//response返回內(nèi)容
ServerHttpResponse originalResponse = exchange.getResponse();
DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory();
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
Flux<? extends DataBuffer> fluxBody = Flux.from(body);
body = fluxBody.buffer().map(dataBuffers -> {
DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
DataBuffer join = dataBufferFactory.join(dataBuffers);
byte[] content = new byte[join.readableByteCount()];
join.read(content);
String responseData = new String(content, StandardCharsets.UTF_8);
log.info("***********************************響應信息**********************************");
log.info("響應內(nèi)容:{}", responseData);
log.info("****************************************************************************\n");
DataBufferUtils.release(join);
//TODO 使用@Ansync異步方法日志入庫
//修改返回內(nèi)容,返回內(nèi)容是JSON字符串,因此需要把JSON轉(zhuǎn)成具體的對象再處理。
//R r = om.readValue(responseData, R.class);//R是統(tǒng)一泛型返回對象,這里因人而已,不具體介紹。
//String newContent = om.writeValueAsString(r);
//return bufferFactory.wrap(newContent.getBytes());
return bufferFactory.wrap(content);
});
return super.writeWith(body);
}
};
log.info("****************************************************************************\n");
//獲取body,雖然該方法在后面,但是實際效果是在response前面
if (header.getContentLength() > 0) {
return DataBufferUtils.join(exchange.getRequest().getBody()).flatMap(dataBuffer -> {
byte[] bytes = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(bytes);
String bodyString = new String(bytes, StandardCharsets.UTF_8);
//設置requestBody到變量,讓response獲取
requestBody.set(bodyString);
log.info("requestBody = {}", bodyString);
exchange.getAttributes().put("POST_BODY", bodyString);
DataBufferUtils.release(dataBuffer);
Flux<DataBuffer> cachedFlux = Flux.defer(() -> Mono.just(exchange.getResponse().bufferFactory().wrap(bytes)));
ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) {
@Override
public Flux<DataBuffer> getBody() {
return cachedFlux;
}
};
return chain.filter(exchange.mutate().request(mutatedRequest).response(decoratedResponse).build());
});
}
//沒有獲取BODY,不用處理request
return chain.filter(exchange.mutate().response(decoratedResponse).build());
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
到了這里,關于springcloud的gateway之GlobalFilter獲取請求信息及requestBody的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!