Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
S
sts网站
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
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
liyang
sts网站
Commits
ab992f48
Commit
ab992f48
authored
Mar 13, 2020
by
RuoYi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修复防重复提交注解无效问题
parent
baea48be
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
172 additions
and
13 deletions
+172
-13
RepeatableFilter.java
...c/main/java/com/ruoyi/common/filter/RepeatableFilter.java
+48
-0
RepeatedlyRequestWrapper.java
...ava/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java
+84
-0
XssFilter.java
ruoyi/src/main/java/com/ruoyi/common/filter/XssFilter.java
+1
-1
XssHttpServletRequestWrapper.java
...com/ruoyi/common/filter/XssHttpServletRequestWrapper.java
+1
-1
FilterConfig.java
...rc/main/java/com/ruoyi/framework/config/FilterConfig.java
+16
-2
SameUrlDataInterceptor.java
...yi/framework/interceptor/impl/SameUrlDataInterceptor.java
+22
-9
No files found.
ruoyi/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java
0 → 100644
View file @
ab992f48
package
com
.
ruoyi
.
common
.
filter
;
import
java.io.IOException
;
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
com.ruoyi.common.enums.HttpMethod
;
/**
* Repeatable 过滤器
*
* @author ruoyi
*/
public
class
RepeatableFilter
implements
Filter
{
@Override
public
void
init
(
FilterConfig
filterConfig
)
throws
ServletException
{
}
@Override
public
void
doFilter
(
ServletRequest
request
,
ServletResponse
response
,
FilterChain
chain
)
throws
IOException
,
ServletException
{
HttpServletRequest
req
=
(
HttpServletRequest
)
request
;
if
(
HttpMethod
.
PUT
.
name
().
equals
(
req
.
getMethod
())
||
HttpMethod
.
POST
.
name
().
equals
(
req
.
getMethod
()))
{
RepeatedlyRequestWrapper
repeatedlyRequest
=
new
RepeatedlyRequestWrapper
((
HttpServletRequest
)
request
);
chain
.
doFilter
(
repeatedlyRequest
,
response
);
}
else
{
chain
.
doFilter
(
request
,
response
);
}
}
@Override
public
void
destroy
()
{
}
}
ruoyi/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java
0 → 100644
View file @
ab992f48
package
com
.
ruoyi
.
common
.
filter
;
import
java.io.BufferedReader
;
import
java.io.ByteArrayInputStream
;
import
java.io.IOException
;
import
java.io.InputStreamReader
;
import
java.nio.charset.Charset
;
import
javax.servlet.ReadListener
;
import
javax.servlet.ServletInputStream
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequestWrapper
;
import
com.ruoyi.common.utils.StringUtils
;
/**
* 构建可重复读取inputStream的request
*
* @author ruoyi
*/
public
class
RepeatedlyRequestWrapper
extends
HttpServletRequestWrapper
{
private
final
byte
[]
body
;
public
RepeatedlyRequestWrapper
(
HttpServletRequest
request
)
throws
IOException
{
super
(
request
);
body
=
readBytes
(
request
.
getReader
(),
"utf-8"
);
}
@Override
public
BufferedReader
getReader
()
throws
IOException
{
return
new
BufferedReader
(
new
InputStreamReader
(
getInputStream
()));
}
@Override
public
ServletInputStream
getInputStream
()
throws
IOException
{
final
ByteArrayInputStream
bais
=
new
ByteArrayInputStream
(
body
);
return
new
ServletInputStream
()
{
@Override
public
boolean
isFinished
()
{
return
false
;
}
@Override
public
boolean
isReady
()
{
return
false
;
}
@Override
public
void
setReadListener
(
ReadListener
listener
)
{
}
@Override
public
int
read
()
throws
IOException
{
return
bais
.
read
();
}
};
}
/**
* 通过BufferedReader和字符编码集转换成byte数组
*/
private
byte
[]
readBytes
(
BufferedReader
br
,
String
encoding
)
throws
IOException
{
String
str
=
null
,
retStr
=
""
;
while
((
str
=
br
.
readLine
())
!=
null
)
{
retStr
+=
str
;
}
if
(
StringUtils
.
isNotBlank
(
retStr
))
{
return
retStr
.
getBytes
(
Charset
.
forName
(
encoding
));
}
return
null
;
}
}
ruoyi/src/main/java/com/ruoyi/common/
xss
/XssFilter.java
→
ruoyi/src/main/java/com/ruoyi/common/
filter
/XssFilter.java
View file @
ab992f48
package
com
.
ruoyi
.
common
.
xss
;
package
com
.
ruoyi
.
common
.
filter
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
...
...
ruoyi/src/main/java/com/ruoyi/common/
xss
/XssHttpServletRequestWrapper.java
→
ruoyi/src/main/java/com/ruoyi/common/
filter
/XssHttpServletRequestWrapper.java
View file @
ab992f48
package
com
.
ruoyi
.
common
.
xss
;
package
com
.
ruoyi
.
common
.
filter
;
import
java.io.ByteArrayInputStream
;
import
java.io.ByteArrayInputStream
;
import
java.io.IOException
;
import
java.io.IOException
;
...
...
ruoyi/src/main/java/com/ruoyi/framework/config/FilterConfig.java
View file @
ab992f48
...
@@ -7,8 +7,9 @@ import org.springframework.beans.factory.annotation.Value;
...
@@ -7,8 +7,9 @@ import org.springframework.beans.factory.annotation.Value;
import
org.springframework.boot.web.servlet.FilterRegistrationBean
;
import
org.springframework.boot.web.servlet.FilterRegistrationBean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Configuration
;
import
com.ruoyi.common.filter.RepeatableFilter
;
import
com.ruoyi.common.filter.XssFilter
;
import
com.ruoyi.common.utils.StringUtils
;
import
com.ruoyi.common.utils.StringUtils
;
import
com.ruoyi.common.xss.XssFilter
;
/**
/**
* Filter配置
* Filter配置
...
@@ -36,11 +37,24 @@ public class FilterConfig
...
@@ -36,11 +37,24 @@ public class FilterConfig
registration
.
setFilter
(
new
XssFilter
());
registration
.
setFilter
(
new
XssFilter
());
registration
.
addUrlPatterns
(
StringUtils
.
split
(
urlPatterns
,
","
));
registration
.
addUrlPatterns
(
StringUtils
.
split
(
urlPatterns
,
","
));
registration
.
setName
(
"xssFilter"
);
registration
.
setName
(
"xssFilter"
);
registration
.
setOrder
(
Integer
.
MAX_VALU
E
);
registration
.
setOrder
(
FilterRegistrationBean
.
HIGHEST_PRECEDENC
E
);
Map
<
String
,
String
>
initParameters
=
new
HashMap
<
String
,
String
>();
Map
<
String
,
String
>
initParameters
=
new
HashMap
<
String
,
String
>();
initParameters
.
put
(
"excludes"
,
excludes
);
initParameters
.
put
(
"excludes"
,
excludes
);
initParameters
.
put
(
"enabled"
,
enabled
);
initParameters
.
put
(
"enabled"
,
enabled
);
registration
.
setInitParameters
(
initParameters
);
registration
.
setInitParameters
(
initParameters
);
return
registration
;
return
registration
;
}
}
@SuppressWarnings
({
"rawtypes"
,
"unchecked"
})
@Bean
public
FilterRegistrationBean
someFilterRegistration
()
{
FilterRegistrationBean
registration
=
new
FilterRegistrationBean
();
registration
.
setFilter
(
new
RepeatableFilter
());
registration
.
addUrlPatterns
(
"/*"
);
registration
.
setName
(
"repeatableFilter"
);
registration
.
setOrder
(
FilterRegistrationBean
.
LOWEST_PRECEDENCE
);
return
registration
;
}
}
}
ruoyi/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java
View file @
ab992f48
...
@@ -2,14 +2,19 @@ package com.ruoyi.framework.interceptor.impl;
...
@@ -2,14 +2,19 @@ package com.ruoyi.framework.interceptor.impl;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.Map
;
import
java.util.concurrent.TimeUnit
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpSession
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
import
com.alibaba.fastjson.JSONObject
;
import
com.alibaba.fastjson.JSONObject
;
import
com.ruoyi.common.filter.RepeatedlyRequestWrapper
;
import
com.ruoyi.common.utils.StringUtils
;
import
com.ruoyi.common.utils.http.HttpHelper
;
import
com.ruoyi.framework.interceptor.RepeatSubmitInterceptor
;
import
com.ruoyi.framework.interceptor.RepeatSubmitInterceptor
;
import
com.ruoyi.framework.redis.RedisCache
;
/**
/**
* 判断请求url和数据是否和上一次相同,
* 判断请求url和数据是否和上一次相同,
* 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
* 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
*
*
* @author ruoyi
* @author ruoyi
...
@@ -23,6 +28,9 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
...
@@ -23,6 +28,9 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
public
final
String
SESSION_REPEAT_KEY
=
"repeatData"
;
public
final
String
SESSION_REPEAT_KEY
=
"repeatData"
;
@Autowired
private
RedisCache
redisCache
;
/**
/**
* 间隔时间,单位:秒 默认10秒
* 间隔时间,单位:秒 默认10秒
*
*
...
@@ -39,8 +47,14 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
...
@@ -39,8 +47,14 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
@Override
@Override
public
boolean
isRepeatSubmit
(
HttpServletRequest
request
)
public
boolean
isRepeatSubmit
(
HttpServletRequest
request
)
{
{
// 本次参数及系统时间
RepeatedlyRequestWrapper
repeatedlyRequest
=
(
RepeatedlyRequestWrapper
)
request
;
String
nowParams
=
JSONObject
.
toJSONString
(
request
.
getParameterMap
());
String
nowParams
=
HttpHelper
.
getBodyString
(
repeatedlyRequest
);
// body参数为空,获取Parameter的数据
if
(
StringUtils
.
isEmpty
(
nowParams
))
{
nowParams
=
JSONObject
.
toJSONString
(
request
.
getParameterMap
());
}
Map
<
String
,
Object
>
nowDataMap
=
new
HashMap
<
String
,
Object
>();
Map
<
String
,
Object
>
nowDataMap
=
new
HashMap
<
String
,
Object
>();
nowDataMap
.
put
(
REPEAT_PARAMS
,
nowParams
);
nowDataMap
.
put
(
REPEAT_PARAMS
,
nowParams
);
nowDataMap
.
put
(
REPEAT_TIME
,
System
.
currentTimeMillis
());
nowDataMap
.
put
(
REPEAT_TIME
,
System
.
currentTimeMillis
());
...
@@ -48,8 +62,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
...
@@ -48,8 +62,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
// 请求地址(作为存放session的key值)
// 请求地址(作为存放session的key值)
String
url
=
request
.
getRequestURI
();
String
url
=
request
.
getRequestURI
();
HttpSession
session
=
request
.
getSession
();
Object
sessionObj
=
redisCache
.
getCacheObject
(
SESSION_REPEAT_KEY
);
Object
sessionObj
=
session
.
getAttribute
(
SESSION_REPEAT_KEY
);
if
(
sessionObj
!=
null
)
if
(
sessionObj
!=
null
)
{
{
Map
<
String
,
Object
>
sessionMap
=
(
Map
<
String
,
Object
>)
sessionObj
;
Map
<
String
,
Object
>
sessionMap
=
(
Map
<
String
,
Object
>)
sessionObj
;
...
@@ -62,9 +75,9 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
...
@@ -62,9 +75,9 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
}
}
}
}
}
}
Map
<
String
,
Object
>
session
Map
=
new
HashMap
<
String
,
Object
>();
Map
<
String
,
Object
>
cache
Map
=
new
HashMap
<
String
,
Object
>();
session
Map
.
put
(
url
,
nowDataMap
);
cache
Map
.
put
(
url
,
nowDataMap
);
session
.
setAttribute
(
SESSION_REPEAT_KEY
,
sessionMap
);
redisCache
.
setCacheObject
(
SESSION_REPEAT_KEY
,
cacheMap
,
intervalTime
,
TimeUnit
.
SECONDS
);
return
false
;
return
false
;
}
}
...
...
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