您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页[技术博客]SPRINGBOOT自定义注解

[技术博客]SPRINGBOOT自定义注解

来源:爱go旅游网
[技术博客]SPRINGBOOT⾃定义注解

SPRINGBOOT⾃定义注解

在springboot中,有各种各样的注解,这些注解能够简化我们的配置,提⾼开发效率。⼀般来说,springboot提供的注解已经佷丰富了,但如果我们想针对某个特定情景来添加注解,就可以使⽤⾃定义注解。

⾃定义注解的步骤

实现这个⾃定义注解⼀般主要有以下⼏个步骤。

maven导⼊相关的依赖声明注解

注解的具体实现使⽤注解的实例

在phyweb项⽬中的应⽤

之所以会想到这个⾃定义注解,是因为我们在给⽤户发送邮件这个模块中,⽤户如果提交了请求,提交按钮被禁⽤,这个时候⽤户如果刷新页⾯的话,这仍然是⼀条post请求,⽽后⾯的这条请求我们不应该处理,⽽是提醒⽤户已经发送了。

引⼊相关依赖

org.springframework.boot spring-boot-starter-aop

com.google.guava guava 21.0

声明⾃定义注解

@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 CACHES = CacheBuilder.newBuilder() // 最⼤缓存 100 个 .maximumSize(1000)

// 设置写缓存后 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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务