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

添加打印日志

上级 7847db2a
...@@ -22,6 +22,9 @@ public class UserDataServiceImpl implements UserDataService { ...@@ -22,6 +22,9 @@ public class UserDataServiceImpl implements UserDataService {
@Override @Override
public JSONObject getUserByToken(String token) { public JSONObject getUserByToken(String token) {
ValueOperations<String, String> vo = redisTemplate.opsForValue(); ValueOperations<String, String> vo = redisTemplate.opsForValue();
String val = vo.get(token); String val = vo.get(token);
return JSONObject.parseObject(val); return JSONObject.parseObject(val);
......
package com.promotion.gateway.filter; package com.promotion.gateway.filter;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.promotion.gateway.data.UserDataService; 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.R;
import com.wangxiaolu.promotion.result.basedata.RCode; import com.wangxiaolu.promotion.result.basedata.RCode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; 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.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer; 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.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.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import java.util.Objects; import java.util.Objects;
/** /**
...@@ -34,22 +41,31 @@ import java.util.Objects; ...@@ -34,22 +41,31 @@ import java.util.Objects;
public class AuthGlobalFilter implements GlobalFilter, Ordered { 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 @Autowired
UserDataService userDataService; UserDataService userDataService;
@Override @Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { 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(); String url = exchange.getRequest().getURI().getPath();
// 1、判断url是否放行 // 1、判断url是否放行
if (url.contains(whiteUrl)) { boolean isIgnore = whiteUrls.stream().anyMatch(url::contains);
if (isIgnore) {
log.info("请求放行,URL:{}", url); log.info("请求放行,URL:{}", url);
return chain.filter(exchange); return chain.filter(exchange);
} }
String token = exchange.getRequest().getHeaders().getFirst("Authorization"); String token = exchange.getRequest().getHeaders().getFirst("Authorization");
// 2、未登录请求跳转登录 // 2、未登录请求跳转登录
if (StringUtils.isBlank(token)) { if (StringUtils.isBlank(token)) {
...@@ -57,12 +73,44 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered { ...@@ -57,12 +73,44 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
} }
// 3、验证token' // 3、验证token'
JSONObject userJson = userDataService.getUserByToken(token); JSONObject userJson = userDataService.getUserByToken(RedisKeys.UserKeys.TEMPORARY_TOKEN.getKey() + token);
if (Objects.isNull(userJson)) { if (Objects.isNull(userJson)) {
log.info("token登录错误:{}", token); log.info("token登录错误:{}", token);
return loginError(exchange); 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); return chain.filter(exchange);
} }
...@@ -77,7 +125,12 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered { ...@@ -77,7 +125,12 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
response.getHeaders().add("Content-Type", "application/json;charset=UTF-8"); response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
R res = new R(RCode.NOT_LOGIN_ERROR); R res = new R(RCode.NOT_LOGIN_ERROR);
DataBuffer buffer = response.bufferFactory().wrap(new Gson().toJson(res).getBytes(StandardCharsets.UTF_8)); DataBuffer buffer = response.bufferFactory().wrap(new Gson().toJson(res).getBytes(StandardCharsets.UTF_8));
log.info("------------- 结束 -------------");
return response.writeWith(Flux.just(buffer)); 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
...@@ -5,9 +5,9 @@ spring: ...@@ -5,9 +5,9 @@ spring:
username: LnNDBM username: LnNDBM
password: fd0%bhD4@oO(% password: fd0%bhD4@oO(%
redis: redis:
port: 21101 port: 7548
host: bj-crs-oyzhz3c6.sql.tencentcdb.com host: 192.168.0.11
database: 0 database: 1
password: u)R3jrHk(qwt~mv$Tg=U password: u)R3jrHk(qwt~mv$Tg=U
main: main:
......
server: server:
port: 8010 port: 8010
max-http-header-size: 2MB
spring: spring:
application: application:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论