在网关全局过滤器中中进行的一些操作,开发可能会用到,持续更新
直接返回字符串或json格式 获取请求头中token 拿到get或者post请求中的参数 拿到请求返回值……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
代码如下
package com.example.filter;
import com.example.code.Res;
import com.example.code.ResultCode;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
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.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.zip.GZIPInputStream;
@Component
@Slf4j
public class MyGlobaTest implements GlobalFilter, Ordered {
//
// @Override
// @SneakyThrows
// public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// ObjectMapper objectMapper = new ObjectMapper();
// String s = objectMapper.writeValueAsString(Res.failed(ResultCode.FAILED,"失败咯"));
// ServerHttpResponse response = exchange.getResponse();
// response.setStatusCode(HttpStatus.OK);
// response.getHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
// return response.writeAndFlushWith(Flux.just(ByteBufFlux.just(response.bufferFactory().wrap(s.getBytes()))));
// }
//
// @Override
// @SneakyThrows
// public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// ServerHttpRequest request = exchange.getRequest();
// String authorization = request.getHeaders().getFirst("Authorization");
// if (!ObjectUtils.isEmpty(authorization)){
// authorization = authorization.replace("Bearer", "").trim();
// }
// return chain.filter(exchange);
// }
//
// @Override
// @SneakyThrows
// public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// ServerHttpRequest request = exchange.getRequest();
// String method = request.getMethod().name();
// if (HttpPost.METHOD_NAME.equals(method)) {
// return DataBufferUtils.join(exchange.getRequest().getBody())
// .flatMap(dataBuffer -> {
// byte[] bytes = new byte[dataBuffer.readableByteCount()];
// dataBuffer.read(bytes);
// // 拿到post请求参数
// String bodyString = new String(bytes, StandardCharsets.UTF_8);
// exchange.getAttributes().put("POST_BODY", bodyString);
// DataBufferUtils.release(dataBuffer);
// Flux cachedFlux = Flux.defer(() -> {
// DataBuffer buffer = exchange.getResponse().bufferFactory()
// .wrap(bytes);
// return Mono.just(buffer);
// });
//
// ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(
// exchange.getRequest()) {
// @Override
// public Flux getBody() {
// return cachedFlux;
// }
// };
// return chain.filter(exchange.mutate().request(mutatedRequest).build());
// });
// }else {
// // 拿到get请求参数
// MultiValueMap queryParams = request.getQueryParams();
// ObjectMapper obj = new ObjectMapper();
// String valueAsString = obj.writeValueAsString(queryParams);
// return chain.filter(exchange);
// }
// }
@SneakyThrows
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpResponseDecorator responseBody = getResponseBody(exchange);
return chain.filter(exchange.mutate().response(responseBody).build());
}
public ServerHttpResponseDecorator getResponseBody(ServerWebExchange exchange){
ServerHttpResponse originalResponse = exchange.getResponse();
DataBufferFactory bufferFactory = originalResponse.bufferFactory();
return new ServerHttpResponseDecorator(originalResponse) {
@Override
public Mono writeWith(Publisher extends DataBuffer> body) {
if (body instanceof Flux) {
Flux extends DataBuffer> fluxBody = (Flux extends DataBuffer>) body;
return super.writeWith(fluxBody.buffer().map(dataBuffer -> {
DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
DataBuffer join = dataBufferFactory.join(dataBuffer);
byte[] content = new byte[join.readableByteCount()];
join.read(content);
//释放掉内存
DataBufferUtils.release(join);
String s = new String(content, StandardCharsets.UTF_8);
List strings = exchange.getResponse().getHeaders().get(HttpHeaders.CONTENT_ENCODING);
if (!CollectionUtils.isEmpty(strings) && strings.contains("gzip")) {
GZIPInputStream gzipInputStream = null;
try {
gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(content), content.length);
StringWriter writer = new StringWriter();
IOUtils.copy(gzipInputStream, writer, "UTF-8");
s = writer.toString();
} catch (IOException e) {
log.error("====Gzip IO error", e);
} finally {
if (gzipInputStream != null) {
try {
gzipInputStream.close();
} catch (IOException e) {
log.error("===Gzip IO close error", e);
}
}
}
} else {
s = new String(content, StandardCharsets.UTF_8);
}
return bufferFactory.wrap(content);
}));
}
return super.writeWith(body);
}
};
}
@Override
public int getOrder() {
return -2;
}
}



