Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
X
xyqb-user2
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
head_group
xyqb-user2
Commits
fc49f055
Commit
fc49f055
authored
Dec 11, 2024
by
李文彬
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat(*): 增加外网调用请求日志打印
parent
f4c8bae1
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
115 additions
and
0 deletions
+115
-0
IpLimitFilter.java
src/main/java/cn/quantgroup/xyqb/filter/IpLimitFilter.java
+115
-0
No files found.
src/main/java/cn/quantgroup/xyqb/filter/IpLimitFilter.java
0 → 100644
View file @
fc49f055
package
cn
.
quantgroup
.
xyqb
.
filter
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.extra.servlet.ServletUtil
;
import
cn.quantgroup.xyqb.util.IpUtil
;
import
lombok.Getter
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
javax.servlet.Filter
;
import
javax.servlet.FilterChain
;
import
javax.servlet.FilterConfig
;
import
javax.servlet.ServletException
;
import
javax.servlet.ServletRequest
;
import
javax.servlet.ServletResponse
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.util.concurrent.TimeUnit
;
/**
* @author hyuk
*/
@Slf4j
@RequiredArgsConstructor
@Configuration
public
class
IpLimitFilter
implements
Filter
{
@Getter
@Value
(
"${extranet.known.ips:123.56.31.54}"
)
private
String
[]
extranetIps
;
private
final
StringRedisTemplate
stringRedisTemplate
;
// 1. 日 IP 访问次数
static
final
String
DAY_IP_COUNT_KEY
=
"xyqb_user:01:ip_limit:day_count:00cs:%s"
;
// 2. 区间请求次数
static
final
String
IP_REQ_ZSET_COUNT_KEY
=
"xyqb_user:01:ip_REQ_ZSET_COUNT:03cs:%s"
;
// 500ms
static
final
long
REQUEST_LIMIT_TIME
=
TimeUnit
.
MINUTES
.
toMillis
(
1L
);
private
static
String
getDayIpCountKey
()
{
String
day
=
DateUtil
.
format
(
DateUtil
.
date
(),
"yyyyMMdd"
);
return
String
.
format
(
DAY_IP_COUNT_KEY
,
day
);
}
private
static
String
getIpReqZSetCountKey
(
String
ip
)
{
return
String
.
format
(
IP_REQ_ZSET_COUNT_KEY
,
ip
);
}
@Override
public
void
init
(
FilterConfig
filterConfig
)
throws
ServletException
{
}
@Override
public
void
doFilter
(
ServletRequest
servletRequest
,
ServletResponse
servletResponse
,
FilterChain
filterChain
)
throws
IOException
,
ServletException
{
HttpServletRequest
request
=
(
HttpServletRequest
)
servletRequest
;
HttpServletResponse
response
=
(
HttpServletResponse
)
servletResponse
;
String
clientIp
=
ServletUtil
.
getClientIP
(
request
);
// finance-gateway Ip
if
(
IpUtil
.
whiteOf
(
clientIp
)
||
(
StringUtils
.
isNotEmpty
(
clientIp
)
&&
isInExtranet
(
clientIp
)))
{
// 在 IP 白名单里
filterChain
.
doFilter
(
servletRequest
,
servletResponse
);
return
;
}
log
.
info
(
"[IpLimitFilter]外网调用, clientIp : {}, uri : {}"
,
clientIp
,
request
.
getRequestURI
());
filterChain
.
doFilter
(
servletRequest
,
servletResponse
);
return
;
// try {
// // 1. 一天内请求多少次
// // 2. 1 分钟请求次数超过 5 次
// String dayIpCountKey = getDayIpCountKey();
// stringRedisTemplate.opsForHash().increment(dayIpCountKey, clientIp, 1L);
// stringRedisTemplate.expire(dayIpCountKey, 2L, TimeUnit.DAYS);
//
// long currentTime = System.currentTimeMillis();
// String ipReqZSetCountKey = getIpReqZSetCountKey(clientIp);
// stringRedisTemplate.opsForZSet().add(ipReqZSetCountKey, currentTime + "", currentTime);
// stringRedisTemplate.expire(ipReqZSetCountKey, 12L, TimeUnit.HOURS);
// // 1 分钟内请求次数
// long reqCount = stringRedisTemplate.opsForZSet().count(ipReqZSetCountKey, currentTime - REQUEST_LIMIT_TIME, currentTime);
// int limit = 5;
// if (reqCount >= limit) {
// log.warn("[IpLimitFilter]clientIp一分钟内请求次数超过 {} 次, clientIp : {}, count : {}", limit, clientIp, reqCount);
// }
// } catch (Exception e) {
// log.error("[IpLimitFilter] ip 请求维度统计出现异常, clientIp : {}, uri : {}", clientIp, request.getRequestURI(), e);
// } finally {
// filterChain.doFilter(servletRequest, servletResponse);
// }
}
private
boolean
isInExtranet
(
String
clientIp
)
{
for
(
String
extranetIp
:
extranetIps
)
{
if
(
clientIp
.
startsWith
(
extranetIp
))
{
return
true
;
}
}
return
false
;
}
@Override
public
void
destroy
()
{
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment