SpringBoot如何编写一个自定义注解呢?

欣喜 SpringBoot 发布时间:2024-01-30 11:05:16 阅读数:3319 1
下文笔者讲述SpringBoot加入自定义注解的方法及示例分享,如下所示

新增注解类

NotRepeatSubmit.java
 
package com.example.demo.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解,防止重复提交。
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.Runtime)
public @interface NotRepeatSubmit {

    /** 过期时间,单位毫秒 **/
    long value() default 5000;
}

ApiUti.java

 
package com.example.demo.annotation;

import com.example.demo.token.NotRepeatSubmit;
import org.springframework.messaging.handler.HandlerMethod;

import java.lang.reflect.Method;

/**
 * API工具类
 */
public class ApiUtil {


    /**
     * 获取方法上的@NotRepeatSubmit注解
     *
     * @param handler
     * @return
     */
    public static NotRepeatSubmit getNotRepeatSubmit(Object handler) {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
            NotRepeatSubmit annotation = method.getAnnotation(NotRepeatSubmit.class);
            return annotation;
        }
        return null;
    }
}

拦截器类

MyInterceptor.java

package com.example.demo.annotation;

import com.example.demo.token.NotRepeatSubmit;
import io.jsonwebtoken.lang.Assert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.redisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.concurrent.TimeUnit;

/**
 * 拦截器
 */
@Component
public class MyInterceptor extends HandlerInterceptorAdapter {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * @param request
     * @param response
     * @param handler  访问的目标方法
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //这是请求接口时带的随机字符串
        String sign = request.getHeader("sign");

        // 获取注解上的超时时间 默认为5分钟
        NotRepeatSubmit notRepeatSubmit = ApiUtil.getNotRepeatSubmit(handler);
        long expireTime = notRepeatSubmit == null ? 5 * 60 * 1000 : notRepeatSubmit.value();


        // 拒绝重复调用(第一次访问时存储,过期时间和请求超时时间保持一致), 只有标注不允许重复提交注解的才会校验
        if (notRepeatSubmit != null) {
            boolean exists = redisTemplate.hasKey(sign);
            Assert.isTrue(!exists, "请勿重复提交");
            redisTemplate.opsForValue().set(sign, 0, expireTime, TimeUnit.MILLISECONDS);
        }

        return super.preHandle(request, response, handler);
    }
}

WebMvcConfiguration.java

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.WebMvcConfigurer;

/**
 * 将自己写的MyInterceptor添加到拦截配置器中  
 * 尽量使用实现 WebMvcConfigurer 的接口的方式
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/api/**");
    }
}

控制器类使用自定义注解

package com.example.demo.annotation;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;



/**
 * 请求控制器
 */
@Slf4j
@RestController
public class TestController {


    /**
     * @NotRepeatSubmit 是自定义注解 防止重复提交
     * @return
     */
    @NotRepeatSubmit(5000)
    @PostMapping("/api/test")
    public void test(String name) {

    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringBoot/202401/7844.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者