Heim > Java > javaLernprogramm > Hauptteil

So implementieren Sie Interface-Anti-Brushing im SpringBoot-Projekt

PHPz
Freigeben: 2023-05-10 23:25:11
nach vorne
1217 Leute haben es durchsucht

1. Benutzerdefinierte Annotation

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

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * @author Yang
 * @version 1.0
 * @date 2021/2/22 10:28
 */
@Retention(RUNTIME)
@Target(METHOD)
public @interface AccessLimit {

    int seconds();

    int maxCount();

    boolean needLogin() default true;

}
Nach dem Login kopieren

2. Definieren Sie den Interceptor

import com.alibaba.fastjson.JSON;
import com.mengxiangnongfu.payment.annotation.AccessLimit;
import com.mengxiangnongfu.payment.commons.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;

/**
 * @author Yang
 * @version 1.0
 * @date 2021/2/22 10:29
 */
@Component
public class FangshuaInterceptor extends HandlerInterceptorAdapter {

    @Autowired
    private RedisUtil redisUtil;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判断请求是否属于方法的请求
        if (handler instanceof HandlerMethod) {
            HandlerMethod hm = (HandlerMethod) handler;
            //获取方法中的注解,看是否有该注解
            AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class);
            if (accessLimit == null) {
                return true;
            }
            int seconds = accessLimit.seconds();
            int maxCount = accessLimit.maxCount();
            boolean login = accessLimit.needLogin();
            String key = "1";
            //如果需要登录
            if (login) {
                //获取登录的session进行判断
                //.....
                key += "" + "1";  //这里假设用户是1,项目中是动态获取的userId
            }

            //从redis中获取用户访问的次数
            Integer count = (Integer) redisUtil.get(key);
            if (count == null) {
                //第一次访问
                redisUtil.set(key, 1, seconds);
            } else if (count < maxCount) {
                //加1
                redisUtil.incr(key, 1);
            } else {
                //超出访问次数
                render(response, "请求过于频繁~请稍后再试~"); //这里的CodeMsg是一个返回参数
                return false;
            }
        }

        return true;

    }

    private void render(HttpServletResponse response, String cm) throws Exception {
        response.setContentType("application/json;charset=UTF-8");
        OutputStream out = response.getOutputStream();
        String str = JSON.toJSONString(cm);
        out.write(str.getBytes("UTF-8"));
        out.flush();
        out.close();
    }

}
Nach dem Login kopieren

4. Denken Sie daran, die Redis-Verbindung zu konfigurieren

Fügen Sie einfach die Annotation @AccessLimit hinzu, die Sie abfangen müssen = 5, maxCount = 1, needLogin = false) Sekunden Zugriffshäufigkeit zurücksetzen Zeit maxCount maximale Anzahl von Anfragen

Das obige ist der detaillierte Inhalt vonSo implementieren Sie Interface-Anti-Brushing im SpringBoot-Projekt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage