防重提交通常在需要防止用户重复提交表单或执行某些敏感操作时使用,以确保系统的数据一致性和安全性,本文章集结了通用场景下防重提交(参数形式&Token令牌),采用Java的特性(注解和AOP),配合Redis进行实现,使用方便有效。
注解介绍及使用
什么是注解
自JDK 1.5起,Java引入了对元数据(MetaData)的支持,即注解(Annotation)。注解实质上是代码中的特殊标记,用于取代繁琐的配置文件。常见的包括`@Override`、`@Deprecated`等。
什么是元注解
注解的注解,比如当我们需要自定义注解时,会需要一些元注解(meta-annotation),如@Target和@Retention。
java内置4种元注解
@Target 表示该注解用于什么地方
ElementType.CONSTRUCTOR 用在构造器
ElementType.FIELD 用于描述域-属性上
ElementType.METHOD 用在方法上
ElementType.TYPE 用在类或接口上
ElementType.PACKAGE 用于描述包
@Retention 表示在什么级别保存该注解信息
RetentionPolicy.SOURCE 保留到源码上
RetentionPolicy.CLASS 保留到字节码上
RetentionPolicy.RUNTIME 保留到虚拟机运行时(最多,可通过反射获取)
@Documented 将此注解包含在 javadoc 中
@Inherited 是否允许子类继承父类中的注解
@interface
用来声明一个注解,可以通过default来声明参数的默认值,自定义注解时,自动继承了java.lang.annotation.Annotation接口,通过反射可以获取自定义注解
具体代码
import java.lang.annotation.*;
/**
* 自定义防重提交
*/
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RepeatSumbit {
/**
* 防重提交,支持两种,一种是方法参数,一个令牌
*/
enum Type{PARAM,TOKEN}
/**
* 默认防重提交,是方法参数
* @return
*/
Type limitType() default Type.PARAM;
/**
* 加锁过期实际,默认是5秒
* @return
*/
long lockTime() default 5;
}
AOP的介绍和使用
切面作用
利用AOP(面向切面编程),我们可以在不改变原有逻辑的情况下,增加额外的功能。AOP思想将系统的功能分为两个部分,从而分离各种关注点,降低了代码的耦合性,减少了代码侵入性。通过AOP,我们能够统一处理横切逻辑,这使得添加和删除横切逻辑变得更加方便。
AOP里面常见的概念
横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些就叫横切关注点,比如 权限认证、日志、事物。