# resubmit
[resubmit](https://github.com/houbb/resubmit) 是一款为 java 设计的渐进式防止重复提交框架。
[![Build Status](https://travis-ci.com/houbb/resubmit.svg?branch=master)](https://travis-ci.com/houbb/resubmit)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.houbb/resubmit/badge.svg)](http://mvnrepository.com/artifact/com.github.houbb/resubmit)
[![](https://img.shields.io/badge/license-Apache2-FF0080.svg)](https://github.com/houbb/resubmit/blob/master/LICENSE.txt)
[![Open Source Love](https://badges.frapsoft.com/os/v2/open-source.svg?v=103)](https://github.com/houbb/resubmit)
推荐阅读:
[面试官:你们的项目中是怎么做防止重复提交的?](https://mp.weixin.qq.com/s/ZQx7cDUJXMDm4QXAPsfnFQ)
[resubmit 渐进式防重复提交框架简介](https://mp.weixin.qq.com/s/tVkeyrDNc_scRusbClrY1w)
## 创作目的
有时候手动加防止重复提交很麻烦,每次手动编写不利于复用。
所以希望从从简到繁实现一个工具,便于平时使用。
## 特性
- 渐进式实现,可独立 spring 使用
- 基于注解+字节码,配置灵活
- 支持编程式的调用
- 支持注解式,完美整合 spring
- 支持整合 spring-boot
> [变更日志](https://github.com/houbb/resubmit/blob/master/CHANGELOG.md)
# 快速开始
## maven 引入
```xml
<dependency>
<group>com.github.houbb</group>
<artifact>resubmit-core</artifact>
<version>1.1.0</version>
</dependency>
```
## 编码
- UserService.java
`@Resubmit` 对应的属性如下:
| 属性 | 说明 | 默认值 |
|:---|:---|:---|
| value() | 多久内禁止重复提交,单位为毫秒。| 60000 |
```java
@Resubmit(5000)
public void queryInfo(final String id) {
System.out.println("query info: " + id);
}
```
- 测试代码
如果在指定时间差内,重复请求,则会抛出异常 ResubmitException
```java
@Test(expected = ResubmitException.class)
public void errorTest() {
UserService service = ResubmitProxy.getProxy(new UserService());
service.queryInfo("1");
service.queryInfo("1");
}
```
相同的参数直接提交2次,就会报错。
- 测试场景2
如果等待超过指定的 5s,就不会报错。
```java
@Test
public void untilTtlTest() {
UserService service = ResubmitProxy.getProxy(new UserService());
service.queryInfo("1");
DateUtil.sleep(TimeUnit.SECONDS, 6);
service.queryInfo("1");
}
```
## 自定义
`ResubmitProxy.getProxy(new UserService());` 可以获取 UserService 对应的代理。
等价于:
```java
ResubmitBs resubmitBs = ResubmitBs.newInstance()
.cache(new CommonCacheServiceMap())
.keyGenerator(new KeyGenerator())
.tokenGenerator(new HttpServletRequestTokenGenerator());
UserService service = ResubmitProxy.getProxy(new UserService(), resubmitBs);
```
其中 ResubmitBs 作为引导类,对应的策略都支持自定义。
| 属性 | 说明 | 默认值 |
|:---|:---|:---|
| cache() | 缓存实现策略 | 默认为基于 ConcurrentHashMap 实现的基于内存的缓存实现 |
| keyGenerator() | key 实现策略,用于唯一标识一个方法+参数,判断是否为相同的提交 | md5 策略 |
| tokenGenerator() | token 实现策略,用于唯一标识一个用户。 | 从 HttpServletRequest 中的 header 属性 `resubmit_token` 中获取 |
# spring 整合使用
## maven 引入
```xml
<dependency>
<group>com.github.houbb</group>
<artifact>resubmit-spring</artifact>
<version>1.1.0</version>
</dependency>
```
## 代码编写
- UserService.java
```java
@Service
public class UserService {
@Resubmit(5000)
public void queryInfo(final String id) {
System.out.println("query info: " + id);
}
}
```
- SpringConfig.java
```java
@ComponentScan("com.github.houbb.resubmit.test.service")
@EnableResubmit
@Configuration
public class SpringConfig {
}
```
### @EnableResubmit 注解说明
`@EnableResubmit` 中用户可以指定对应的实现策略,便于更加灵活的适应业务场景。
和 `ResubmitBs` 中支持自定义的属性一一对应。
| 属性 | 说明 | 默认值 |
|:---|:---|:---|
| cache() | 缓存实现策略 | 默认为基于 ConcurrentHashMap 实现的基于内存的缓存实现 |
| keyGenerator() | key 实现策略,用于唯一标识一个方法+参数,判断是否为相同的提交 | md5 策略 |
| tokenGenerator() | token 实现策略,用于唯一标识一个用户。 | 从 HttpServletRequest 中的 header 属性 `resubmit_token` 中获取 |
## 测试代码
```java
@ContextConfiguration(classes = SpringConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class ResubmitSpringTest {
@Autowired
private UserService service;
@Test(expected = ResubmitException.class)
public void queryTest() {
service.queryInfo("1");
service.queryInfo("1");
}
}
```
# 整合 spring-boot
## maven 引入
```xml
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>resubmit-springboot-starter</artifactId>
<version>1.1.0</version>
</dependency>
```
## 代码实现
- UserService.java
这个方法实现和前面的一样。
```java
@Service
public class UserService {
@Resubmit(5000)
public void queryInfo(final String id) {
System.out.println("query info: " + id);
}
}
```
- Application.java
启动入口
```java
@SpringBootApplication
public class ResubmitApplication {
public static void main(String[] args) {
SpringApplication.run(ResubmitApplication.class, args);
}
}
```
## 测试代码
```java
@ContextConfiguration(classes = ResubmitApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class ResubmitSpringBootStarterTest {
@Autowired
private UserService service;
@Test(expected = ResubmitException.class)
public void queryTest() {
service.queryInfo("1");
service.queryInfo("1");
}
}
```
# 自定义策略
上面提到 `@EnableResubmit` 中的策略支持自定义。
此处仅以 cache 为例,为了简单,默认是基于本地内存的缓存实现。
**如果你不是单点应用,那么基于 redis 的缓存更加合适**
## 自定义缓存 cache
### 实现缓存
只需要实现 `ICommonCacheService` 接口即可。
```java
public class MyDefineCache extends CommonCacheServiceMap {
// 这里只是作为演示,实际生产建议使用 redis 作为统一缓存
@Override
public synchronized void set(String key, String value, long expireMills) {
System.out.println("------------- 自定义的设置实现");
super.set(key, value, expireMills);
}
}
```
### core 中指定使用
在非 spring 项目中,可以在引导类中指定我们定义的缓存。
```java
ResubmitBs resubmitBs = ResubmitBs.newInstance()
.cache(new MyDefineCache());
UserService service = ResubmitProxy.getProxy(new UserService(), resubmitBs);
```
其他使用方式保持不变。
### spring 中指定使用
在 spring 项目中,我们需要调整一下配置,其他不变。
```java
@ComponentScan("com.github.houbb.resubmit.test.service")
@Configuration
@EnableResubmit(cache = "myDefineCache")
public class SpringDefineConfig {
@Bean("myDefineCache")
public ICommonCacheService myDefineCache() {
return new MyDefineCache();
}
}
```
`@EnableResubmit(cache = "myDefineCache")` 指定我们自定义的缓存策略名称。
# Redis 的内置缓存策略
为了便于复用,基于 redis 的缓存策略已实现,后续有时间进行讲解。
> [Redis-Config](https://github.com/houbb/redis-config)
# 开源地址
为了便于大家学习使用,目前防重复提交框架已开源。
欢迎大家 fork+star,鼓励一下老马~
> [https://github.com/houbb/resubmit](https://github.com/houbb/resubmit)
# Road-Map
- [ ] 优化 spring 对应的版本依赖
- [ ] 添加基于 redis 的 cache 实现
# 中间件等工
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Java SSM项目是一种使用Java语言和SSM框架(Spring + Spring MVC + MyBatis)开发的Web应用程序。SSM是一种常用的Java开发框架组合,它结合了Spring框架、Spring MVC框架和MyBatis框架的优点,能够快速构建可靠、高效的企业级应用。 1. Spring框架:Spring是一个轻量级的Java开发框架,提供了丰富的功能和模块,用于开发企业级应用。它包括IoC(Inverse of Control,控制反转)容器、AOP(Aspect-Oriented Programming,面向切面编程)等特性,可以简化开发过程、提高代码的可维护性和可测试性。 2. Spring MVC框架:Spring MVC是基于Spring框架的Web框架,用于开发Web应用程序。它采用MVC(Model-View-Controller,模型-视图-控制器)的架构模式,将应用程序分为模型层、视图层和控制器层,提供了处理请求、渲染视图和管理流程的功能。 3. MyBatis框架:MyBatis是一个持久层框架,用于与数据库进行交互。它提供了一种将数据库操作与Java对象映射起来的方式,避免了手动编写繁琐的SQL语句,并提供了事务管理和缓存等功能,简化了数据库访问的过程
资源推荐
资源详情
资源评论
收起资源包目录
Java的重复提交工具(高分毕设).zip (67个子文件)
resubmit-master
resubmit-test2
pom.xml 922B
src
test
java
com
github
houbb
resubmit
core
bs
test2
springboot
starter
ResubmitSpringBootStarterTest.java 1018B
main
java
com
github
houbb
resubmit
test2
service
ResubmitApplication.java 394B
UserService.java 362B
resubmit-core
pom.xml 2KB
src
main
java
com
github
houbb
resubmit
core
constant
ResubmitConst.java 411B
api
Resubmit.java 2KB
ResubmitContext.java 3KB
support
token
HttpServletRequestTokenGenerator.java 1KB
proxy
dynamic
DynamicProxy.java 2KB
package-info.java 273B
cglib
CglibProxy.java 1KB
AbstractProxy.java 530B
none
NoneProxy.java 973B
ResubmitProxy.java 2KB
package-info.java 53B
key
KeyGenerator.java 735B
package-info.java 47B
bs
ResubmitBs.java 4KB
package-info.java 39B
cgit.bat 247B
.travis.yml 177B
pom.xml 12KB
resubmit-api
pom.xml 687B
src
main
java
com
github
houbb
resubmit
api
annotation
Resubmit.java 360B
core
IResubmitContext.java 1KB
IResubmit.java 370B
support
IResubmitProxy.java 236B
ITokenGenerator.java 323B
IKeyGenerator.java 378B
exception
ResubmitException.java 668B
package-info.java 38B
doc
版本迭代规范.md 708B
CI集成.md 491B
发布流程.md 701B
issues
个人思考.md 379B
user
01-项目模块.md 232B
LICENSE.txt 20KB
cgit.sh 210B
resubmit-springboot-starter
pom.xml 858B
src
main
resources
META-INF
spring.factories 133B
java
com
github
houbb
resubmit
springboot
starter
package-info.java 99B
config
ResubmitAutoConfig.java 786B
ResubmitProperties.java 697B
github_init.bat 147B
CHANGELOG.md 934B
resubmit-spring
pom.xml 992B
src
main
java
com
github
houbb
resubmit
spring
annotation
EnableResubmit.java 973B
aop
ResubmitAspect.java 1KB
package-info.java 41B
config
ResubmitAopConfig.java 3KB
release_rm.sh 1KB
resubmit-test
pom.xml 1KB
src
test
java
com
github
houbb
resubmit
core
bs
test
spring
ResubmitDefineSpringTest.java 942B
ResubmitSpringTest.java 865B
ResubmitProxyDefineTest.java 802B
ResubmitProxyTest.java 2KB
main
java
com
github
houbb
resubmit
test
cache
MyDefineCache.java 528B
service
UserService.java 361B
package-info.java 39B
config
SpringDefineConfig.java 734B
SpringConfig.java 402B
.coveralls.yml 23B
.gitignore 292B
release.sh 2KB
README.md 9KB
release.bat 1KB
共 67 条
- 1
资源评论
若明天不见
- 粉丝: 1w+
- 资源: 272
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- html动态爱心代码一(附源码)
- c40539bc-071a-486c-9d52-9d0c18d62dac 4.html
- 基于物理的非视域成像(NLOS)算法,利用了nerf+python源码+文档说明
- yuluer知更鸟.7z(1).001
- 基于Qt实现医院信息管理系统c++源码+文档说明+数据库(期末大作业)
- 基于python实现的医院信息管理系统完整源码+sql数据库+详细注释(高分课程设计)
- 基于python的眼底图像视杯视盘分割项目源码+文档说明+截图演示+详细注释(高分课程设计)
- ImageBasedModellingEdu-贰壹贰叁零
- DFFmeasurement-数据预处理
- ImageBasedModellingEdu-回文素数c语言
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功