Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
promotion-gateway
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
promotion
promotion-gateway
Commits
91a8f7fa
提交
91a8f7fa
authored
5月 24, 2024
作者:
000516
提交者:
Coding
5月 24, 2024
浏览文件
操作
浏览文件
下载
差异文件
添加打印日志
Merge Request: 添加打印日志 Created By: @李秋林 Accepted By: @李秋林 URL:
https://g-pkkp8204.coding.net/p/promotion/d/promotion-gateway/git/merge/24
上级
7fa6b7d1
cb31f06c
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
138 行增加
和
12 行删除
+138
-12
UserDataServiceImpl.java
.../com/promotion/gateway/data/impl/UserDataServiceImpl.java
+3
-0
AuthGlobalFilter.java
...n/java/com/promotion/gateway/filter/AuthGlobalFilter.java
+60
-7
WrapperResponseGlobalFilter.java
...promotion/gateway/filter/WrapperResponseGlobalFilter.java
+70
-0
application-dev.yml
src/main/resources/application-dev.yml
+1
-2
application-live.yml
src/main/resources/application-live.yml
+3
-3
application.yml
src/main/resources/application.yml
+1
-0
没有找到文件。
src/main/java/com/promotion/gateway/data/impl/UserDataServiceImpl.java
浏览文件 @
91a8f7fa
...
...
@@ -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
);
...
...
src/main/java/com/promotion/gateway/filter/AuthGlobalFilter.java
浏览文件 @
91a8f7fa
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
()
{
}
}
src/main/java/com/promotion/gateway/filter/WrapperResponseGlobalFilter.java
0 → 100644
浏览文件 @
91a8f7fa
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
src/main/resources/application-dev.yml
浏览文件 @
91a8f7fa
...
...
@@ -31,4 +31,4 @@ spring:
predicates
:
-
Path=/**
logging
:
config
:
classpath:logback-spring.xml
\ No newline at end of file
config
:
classpath:logback-spring.xml
src/main/resources/application-live.yml
浏览文件 @
91a8f7fa
...
...
@@ -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
:
...
...
src/main/resources/application.yml
浏览文件 @
91a8f7fa
server
:
port
:
8010
max-http-header-size
:
2MB
spring
:
application
:
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论