提交 cb31f06c authored 作者: 李秋林's avatar 李秋林

添加打印日志

上级 7847db2a
......@@ -22,6 +22,9 @@ public class UserDataServiceImpl implements UserDataService {
@Override
public JSONObject getUserByToken(String token) {
ValueOperations<String, String> vo = redisTemplate.opsForValue();
String val = vo.get(token);
return JSONObject.parseObject(val);
......
package com.promotion.gateway.filter;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.google.gson.Gson;
import com.promotion.gateway.data.UserDataService;
import com.wangxiaolu.promotion.common.redis.RedisKeys;
import com.wangxiaolu.promotion.result.basedata.R;
import com.wangxiaolu.promotion.result.basedata.RCode;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.filter.OrderedFilter;
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.HttpStatus;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
......@@ -34,22 +41,31 @@ import java.util.Objects;
public class AuthGlobalFilter implements GlobalFilter, Ordered {
// 用户注册、用户登录、发送手机号验证码
private final String whiteUrl = "login";
private final List<String> whiteUrls = Arrays.asList("/login", "/enroll", "/sms/send/ver_code");
@Autowired
UserDataService userDataService;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 当前访问的url
long millis = System.currentTimeMillis();
ServerHttpRequest request = exchange.getRequest();
URI URIPath = request.getURI();
String path = request.getPath().value();
String method = request.getMethodValue();
HttpHeaders header = request.getHeaders();
log.info("------------- 开始 -------------");
log.info("请求request信息:\nURI = {}\npath = {}\nmethod = {}\nheader = {}。", URIPath, path, method, header);
String url = exchange.getRequest().getURI().getPath();
// 1、判断url是否放行
if (url.contains(whiteUrl)) {
boolean isIgnore = whiteUrls.stream().anyMatch(url::contains);
if (isIgnore) {
log.info("请求放行,URL:{}", url);
return chain.filter(exchange);
}
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
// 2、未登录请求跳转登录
if (StringUtils.isBlank(token)) {
......@@ -57,12 +73,44 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
}
// 3、验证token'
JSONObject userJson = userDataService.getUserByToken(token);
JSONObject userJson = userDataService.getUserByToken(RedisKeys.UserKeys.TEMPORARY_TOKEN.getKey() + token);
if (Objects.isNull(userJson)) {
log.info("token登录错误:{}", token);
return loginError(exchange);
}
if ("POST".equals(method)) {
return DataBufferUtils.join(exchange.getRequest().getBody())
.flatMap(dataBuffer -> {
byte[] bytes = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(bytes);
try {
String bodyString = new String(bytes, "utf-8");
log.info("请求参数:\n" + bodyString);
exchange.getAttributes().put("POST_BODY", bodyString);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
DataBufferUtils.release(dataBuffer);
Flux<DataBuffer> cachedFlux = Flux.defer(() -> {
DataBuffer buffer = exchange.getResponse().bufferFactory()
.wrap(bytes);
return Mono.just(buffer);
});
ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(
exchange.getRequest()) {
@Override
public Flux<DataBuffer> getBody() {
return cachedFlux;
}
};
log.info("------------- 结束 用时{}s-------------", System.currentTimeMillis() - millis);
return chain.filter(exchange.mutate().request(mutatedRequest)
.build());
});
}
return chain.filter(exchange);
}
......@@ -77,7 +125,12 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
R res = new R(RCode.NOT_LOGIN_ERROR);
DataBuffer buffer = response.bufferFactory().wrap(new Gson().toJson(res).getBytes(StandardCharsets.UTF_8));
log.info("------------- 结束 -------------");
return response.writeWith(Flux.just(buffer));
}
private void logSave() {
}
}
package com.promotion.gateway.filter;
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.http.HttpStatus;
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.Charset;
/**
* @author : liqiulin
* @date : 2024-05-24 15
* @describe :
*/
@Component
@Slf4j
public class WrapperResponseGlobalFilter implements GlobalFilter, Ordered {
@Override
public int getOrder() {
//-1 is response write filter, must be called before that
return -2;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获取response的 返回数据
ServerHttpResponse originalResponse = exchange.getResponse();
DataBufferFactory bufferFactory = originalResponse.bufferFactory();
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
if (getStatusCode().equals(HttpStatus.OK) && body instanceof Flux) {
Flux<? extends DataBuffer> fluxBody = Flux.from(body);
return super.writeWith(fluxBody.map(dataBuffer -> {
byte[] content = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(content);
//释放掉内存
DataBufferUtils.release(dataBuffer);
//responseData就是下游系统返回的内容,可以查看修改
String responseData = new String(content, Charset.forName("UTF-8"));
log.info("------------- 返回信息 -------------");
log.info(responseData);
log.info("------------- 返回信息 -------------");
byte[] uppedContent = new String(content, Charset.forName("UTF-8")).getBytes();
return bufferFactory.wrap(uppedContent);
}));
} else {
log.error("响应code异常:{}", getStatusCode());
}
return super.writeWith(body);
}
};
return chain.filter(exchange.mutate().response(decoratedResponse).build());
}
}
\ No newline at end of file
......@@ -31,4 +31,4 @@ spring:
predicates:
- Path=/**
logging:
config: classpath:logback-spring.xml
\ No newline at end of file
config: classpath:logback-spring.xml
......@@ -5,9 +5,9 @@ spring:
username: LnNDBM
password: fd0%bhD4@oO(%
redis:
port: 21101
host: bj-crs-oyzhz3c6.sql.tencentcdb.com
database: 0
port: 7548
host: 192.168.0.11
database: 1
password: u)R3jrHk(qwt~mv$Tg=U
main:
......
server:
port: 8010
max-http-header-size: 2MB
spring:
application:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论