上代码
package cn.texous.demo.filter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.reactivestreams.Publisher;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
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 org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
import java.nio.charset.StandardCharsets;
@SuppressWarnings("NullableProblems")
@Slf4j
@Order(6)
@Component
@RequiredArgsConstructor
public class DesensitizedFilter implements WebFilter {
private final DesensitizedService desensitizedService;
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String uri = request.getURI().getPath();
DesensitizedVo byUrl = desensitizedService.getByUrl(uri, request.getMethodValue());
if (byUrl != null
&& (!StringUtils.isEmpty(byUrl.getKeys())
|| !StringUtils.isEmpty(byUrl.getDetailKeys()))) {
ServerHttpResponse original = exchange.getResponse();
ServerHttpResponseDecorator newResponse = new ServerHttpResponseDecorator(original) {
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
Mono<DataBuffer> mono = DataBufferUtils.join(body)
.map(buffer -> {
try {
String data = buffer.toString(StandardCharsets.UTF_8);
String mutatedData = mutate(data, byUrl);
byte[] bytes = mutatedData.getBytes(StandardCharsets.UTF_8);
getHeaders().setContentLength(bytes.length);
return this.bufferFactory().wrap(bytes);
} finally {
DataBufferUtils.release(buffer);
}
});
return super.writeWith(mono);
}
};
return chain.filter(exchange.mutate().response(newResponse).build());
} else {
return chain.filter(exchange);
}
}
private String mutate(String data, DesensitizedVo desensitizedVo) {
try {
return DesensitizedUtils.desensitizedJsonString(data,
desensitizedVo.getKeys(), desensitizedVo.getDetailKeys());
} catch (Exception e) {
log.error("mutate data error", e);
}
return data;
}
}