Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
T
topology
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
姜立玮
topology
Commits
e6cd9c43
提交
e6cd9c43
authored
11月 13, 2019
作者:
RuoYi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
新增@RepeatSubmit注解,防止重复提交
上级
bcee37b8
变更
4
显示空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
187 行增加
和
0 行删除
+187
-0
ResourcesConfig.java
...main/java/com/ruoyi/framework/config/ResourcesConfig.java
+15
-0
RepeatSubmitInterceptor.java
.../ruoyi/framework/interceptor/RepeatSubmitInterceptor.java
+55
-0
RepeatSubmit.java
.../ruoyi/framework/interceptor/annotation/RepeatSubmit.java
+23
-0
SameUrlDataInterceptor.java
...yi/framework/interceptor/impl/SameUrlDataInterceptor.java
+94
-0
没有找到文件。
ruoyi/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
浏览文件 @
e6cd9c43
package
com
.
ruoyi
.
framework
.
config
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.web.servlet.config.annotation.InterceptorRegistry
;
import
org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
;
import
org.springframework.web.servlet.config.annotation.WebMvcConfigurer
;
import
com.ruoyi.common.constant.Constants
;
import
com.ruoyi.framework.interceptor.RepeatSubmitInterceptor
;
/**
* 通用配置
...
...
@@ -13,6 +16,9 @@ import com.ruoyi.common.constant.Constants;
@Configuration
public
class
ResourcesConfig
implements
WebMvcConfigurer
{
@Autowired
private
RepeatSubmitInterceptor
repeatSubmitInterceptor
;
@Override
public
void
addResourceHandlers
(
ResourceHandlerRegistry
registry
)
{
...
...
@@ -23,4 +29,13 @@ public class ResourcesConfig implements WebMvcConfigurer
registry
.
addResourceHandler
(
"swagger-ui.html"
).
addResourceLocations
(
"classpath:/META-INF/resources/"
);
registry
.
addResourceHandler
(
"/webjars/**"
).
addResourceLocations
(
"classpath:/META-INF/resources/webjars/"
);
}
/**
* 自定义拦截规则
*/
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
registry
.
addInterceptor
(
repeatSubmitInterceptor
).
addPathPatterns
(
"/**"
);
}
}
\ No newline at end of file
ruoyi/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java
0 → 100644
浏览文件 @
e6cd9c43
package
com
.
ruoyi
.
framework
.
interceptor
;
import
java.lang.reflect.Method
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.method.HandlerMethod
;
import
org.springframework.web.servlet.handler.HandlerInterceptorAdapter
;
import
com.alibaba.fastjson.JSONObject
;
import
com.ruoyi.common.utils.ServletUtils
;
import
com.ruoyi.framework.interceptor.annotation.RepeatSubmit
;
import
com.ruoyi.framework.web.domain.AjaxResult
;
/**
* 防止重复提交拦截器
*
* @author ruoyi
*/
@Component
public
abstract
class
RepeatSubmitInterceptor
extends
HandlerInterceptorAdapter
{
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
if
(
handler
instanceof
HandlerMethod
)
{
HandlerMethod
handlerMethod
=
(
HandlerMethod
)
handler
;
Method
method
=
handlerMethod
.
getMethod
();
RepeatSubmit
annotation
=
method
.
getAnnotation
(
RepeatSubmit
.
class
);
if
(
annotation
!=
null
)
{
if
(
this
.
isRepeatSubmit
(
request
))
{
AjaxResult
ajaxResult
=
AjaxResult
.
error
(
"不允许重复提交,请稍后再试"
);
ServletUtils
.
renderString
(
response
,
JSONObject
.
toJSONString
(
ajaxResult
));
return
false
;
}
}
return
true
;
}
else
{
return
super
.
preHandle
(
request
,
response
,
handler
);
}
}
/**
* 验证是否重复提交由子类实现具体的防重复提交的规则
*
* @param httpServletRequest
* @return
* @throws Exception
*/
public
abstract
boolean
isRepeatSubmit
(
HttpServletRequest
request
);
}
ruoyi/src/main/java/com/ruoyi/framework/interceptor/annotation/RepeatSubmit.java
0 → 100644
浏览文件 @
e6cd9c43
package
com
.
ruoyi
.
framework
.
interceptor
.
annotation
;
import
java.lang.annotation.Documented
;
import
java.lang.annotation.ElementType
;
import
java.lang.annotation.Inherited
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.RetentionPolicy
;
import
java.lang.annotation.Target
;
/**
* 自定义注解防止表单重复提交
*
* @author ruoyi
*
*/
@Inherited
@Target
(
ElementType
.
METHOD
)
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Documented
public
@interface
RepeatSubmit
{
}
\ No newline at end of file
ruoyi/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java
0 → 100644
浏览文件 @
e6cd9c43
package
com
.
ruoyi
.
framework
.
interceptor
.
impl
;
import
java.util.HashMap
;
import
java.util.Map
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpSession
;
import
org.springframework.stereotype.Component
;
import
com.alibaba.fastjson.JSONObject
;
import
com.ruoyi.framework.interceptor.RepeatSubmitInterceptor
;
/**
* 判断请求url和数据是否和上一次相同,
* 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
*
* @author ruoyi
*/
@Component
public
class
SameUrlDataInterceptor
extends
RepeatSubmitInterceptor
{
public
final
String
REPEAT_PARAMS
=
"repeatParams"
;
public
final
String
REPEAT_TIME
=
"repeatTime"
;
public
final
String
SESSION_REPEAT_KEY
=
"repeatData"
;
/**
* 间隔时间,单位:秒 默认10秒
*
* 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据
*/
private
int
intervalTime
=
10
;
public
void
setIntervalTime
(
int
intervalTime
)
{
this
.
intervalTime
=
intervalTime
;
}
@SuppressWarnings
(
"unchecked"
)
@Override
public
boolean
isRepeatSubmit
(
HttpServletRequest
request
)
{
// 本次参数及系统时间
String
nowParams
=
JSONObject
.
toJSONString
(
request
.
getParameterMap
());
Map
<
String
,
Object
>
nowDataMap
=
new
HashMap
<
String
,
Object
>();
nowDataMap
.
put
(
REPEAT_PARAMS
,
nowParams
);
nowDataMap
.
put
(
REPEAT_TIME
,
System
.
currentTimeMillis
());
// 请求地址(作为存放session的key值)
String
url
=
request
.
getRequestURI
();
HttpSession
session
=
request
.
getSession
();
Object
sessionObj
=
session
.
getAttribute
(
SESSION_REPEAT_KEY
);
if
(
sessionObj
!=
null
)
{
Map
<
String
,
Object
>
sessionMap
=
(
Map
<
String
,
Object
>)
sessionObj
;
if
(
sessionMap
.
containsKey
(
url
))
{
Map
<
String
,
Object
>
preDataMap
=
(
Map
<
String
,
Object
>)
sessionMap
.
get
(
url
);
if
(
compareParams
(
nowDataMap
,
preDataMap
)
&&
compareTime
(
nowDataMap
,
preDataMap
))
{
return
true
;
}
}
}
Map
<
String
,
Object
>
sessionMap
=
new
HashMap
<
String
,
Object
>();
sessionMap
.
put
(
url
,
nowDataMap
);
session
.
setAttribute
(
SESSION_REPEAT_KEY
,
sessionMap
);
return
false
;
}
/**
* 判断参数是否相同
*/
private
boolean
compareParams
(
Map
<
String
,
Object
>
nowMap
,
Map
<
String
,
Object
>
preMap
)
{
String
nowParams
=
(
String
)
nowMap
.
get
(
REPEAT_PARAMS
);
String
preParams
=
(
String
)
preMap
.
get
(
REPEAT_PARAMS
);
return
nowParams
.
equals
(
preParams
);
}
/**
* 判断两次间隔时间
*/
private
boolean
compareTime
(
Map
<
String
,
Object
>
nowMap
,
Map
<
String
,
Object
>
preMap
)
{
long
time1
=
(
Long
)
nowMap
.
get
(
REPEAT_TIME
);
long
time2
=
(
Long
)
preMap
.
get
(
REPEAT_TIME
);
if
((
time1
-
time2
)
<
(
this
.
intervalTime
*
1000
))
{
return
true
;
}
return
false
;
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论