SPRINGBOOT⾃定义注解
在springboot中,有各种各样的注解,这些注解能够简化我们的配置,提⾼开发效率。⼀般来说,springboot提供的注解已经佷丰富了,但如果我们想针对某个特定情景来添加注解,就可以使⽤⾃定义注解。
⾃定义注解的步骤
实现这个⾃定义注解⼀般主要有以下⼏个步骤。
maven导⼊相关的依赖声明注解
注解的具体实现使⽤注解的实例
在phyweb项⽬中的应⽤
之所以会想到这个⾃定义注解,是因为我们在给⽤户发送邮件这个模块中,⽤户如果提交了请求,提交按钮被禁⽤,这个时候⽤户如果刷新页⾯的话,这仍然是⼀条post请求,⽽后⾯的这条请求我们不应该处理,⽽是提醒⽤户已经发送了。
引⼊相关依赖
声明⾃定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME) @Documented @Inherited
public @interface LocalLock { String key() default \"\"; int expire() default 5; }
注解实现
@Aspect
@Configuration
public class LockMethodInterceptor {
private static final Cache // 设置写缓存后 60 秒钟过期 .expireAfterWrite(60, TimeUnit.SECONDS) .build(); @Around(\"execution(public * *(..)) && @annotation(com.buaabetatwo.phyweb.annotation.LocalLock)\") public Object interceptor(ProceedingJoinPoint pjp) { myToken = 1; MethodSignature signature = (MethodSignature) pjp.getSignature(); Method method = signature.getMethod(); LocalLock localLock = method.getAnnotation(LocalLock.class); String key = getKey(localLock.key(), pjp.getArgs()); if (!StringUtils.isEmpty(key)) { if (CACHES.getIfPresent(key) != null) { myToken = 0; // throw new RuntimeException(\"请勿重复请求\"); } // 如果是第⼀次请求,就将 key 当前对象压⼊缓存中 CACHES.put(key, key); } try { return pjp.proceed(); } catch (Throwable throwable) { throw new RuntimeException(\"服务器异常\"); } finally { // CACHES.invalidate(key) } } private String getKey(String keyExpress, Object[] args) { for (int i = 0; i < args.length; i++) { keyExpress = keyExpress.replace(\"arg[\" + i + \"]\ } return keyExpress; } 使⽤注解 @LocalLock(key = \"myToken\") // @PostMapping(\"/reset-email\") public String postResetEmail(String email, Model model) { } 经过以上四个步骤,我们的⾃定义注解LocalLock就⼤功告成了,当⽤户打开密码找回页⾯,输⼊邮箱后,60秒内再次刷新页⾯会被拦截掉,也就是不会出现重复提交表单的情况了。如下图所⽰。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务