文章目录
该示例项目通过自定义注解,实现接口访问次数控制,从而实现接口防刷功能,项目结构如下:
一、编写注解类 AccessLimit
package cn.mygweb.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 访问控制注解(实现接口防刷功能)
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AccessLimit {
/**
* 限制周期(单位为秒)
*
* @return
*/
int seconds();
/**
* 规定周期内限制次数
*
* @return
*/
int maxCount();
/**
* 是否需要登录
*
* @return
*/
boolean needLogin() default false;
}
二、在Interceptor
拦截器中实现拦截逻辑
package cn.mygweb.interceptor;
import cn.mygweb.annotation.AccessLimit;
import cn.mygweb.entity.Result;
import cn.mygweb.entity.StatusCode;
import com.alibaba.fastjson.JSON;
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;
import java.util.HashMap;
import java.util.Map;
/**
* 访问控制拦截器
*/
@Component
public class AccessLimitInterceptor extends HandlerInterceptorAdapter {
//模拟数据存储,实际业务中可以自定义实现方式
private static Map<String, AccessInfo> accessInfoMap = new HashMap<>();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
//判断请求是否属于方法的请求
if (handler instanceof HandlerMethod) {
HandlerMethod hm = (HandlerMethod) handler;
//获取方法中的注解,看是否有该注解
AccessLimit accessLimit = hm