启动类的配置:
package com.yiliao.springcloud;
import com.yiliao.springcloud.interceptor.BrushProofInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@SpringBootApplication(scanBasePackages = {"com.cjh.bs","com.yiliao"})
//@SpringBootApplication
@MapperScan("com.yiliao.springcloud.dao")
@EnableEurekaClient
public class OrgMain8002 implements WebMvcConfigurer
{
//防刷
@Bean
public BrushProofInterceptor brushProofInterceptor(){
return new BrushProofInterceptor();
}
//配置登录拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//防刷 这是配置防刷的权限 路径
registry.addInterceptor(brushProofInterceptor())
.addPathPatterns("/**");
}
public static void main(String[] args) {
SpringApplication.run(OrgMain8002.class,args);
}
}
返回提示信息的实体类
package util;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@NoArgsConstructor
public class JsonResult<T> {
public static final int CODE_SUCCESS = 200;
public static final String MSG_SUCCESS = "操作成功";
public static final int CODE_NOLOGIN = 401;
public static final String MSG_NOLOGIN = "请先登录";
public static final int CODE_ERROR = 500;
public static final String MSG_ERROR = "系统异常,请联系管理员";
public static final int CODE_ERROR_PARAM = 501; //参数异常
private int code; //区分不同结果, 而不再是true或者false
private String msg;
private T data; //除了操作结果之后, 还行携带数据返回
public JsonResult(int code, String msg, T data){
this.code = code;
this.msg = msg;
this.data = data;
}
public static <T> JsonResult success(T data){
return new JsonResult(CODE_SUCCESS, MSG_SUCCESS, data);
}
public static JsonResult success(){
return new JsonResult(CODE_SUCCESS, MSG_SUCCESS, null);
}
public static <T> JsonResult error(int code, String msg, T data){
return new JsonResult(code, msg, data);
}
public static JsonResult defaultError(){
return new JsonResult(CODE_ERROR, MSG_ERROR, null);
}
public static JsonResult noLogin() {
return new JsonResult(CODE_NOLOGIN, MSG_NOLOGIN, null);
}
}
package util;
/**
* 系统常量 缓存短信可用时间
*/
public class Consts {
//验证码有效时间
public static final int READNUMBERVO = 61; //单位分
//验证码有效时间
public static final int VERIFY_CODE_VAI_TIME = 5; //单位分
//token有效时间
public static final int USER_INFO_TOKEN_VAI_TIME = 30; //单位分
}
BrushProofInterceptor实现类
package com.yiliao.springcloud.interceptor;
import com.P.model.pub.Grid;
import com.alibaba.fastjson.JSON;
import com.cjh.ObjectFactory;
import com.yiliao.springcloud.entities.AsCityVO;
import com.yiliao.springcloud.entities.CommonResult;
import com.yiliao.springcloud.redis.ISecurityRedisService;
import com.yiliao.springcloud.utils.RedisKeys;
import com.yiliao.springcloud.utils.RequestUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
* 防刷拦截
*/
public class BrushProofInterceptor implements HandlerInterceptor {
@Autowired
private ISecurityRedisService securityRedisService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//请求接口:url
//http://localhost:8080/xxx/xxx
String url = request.getRequestURI().substring(1);
//请求ip:
String ip = RequestUtil.getIPAddress();
//是否超频率
String key = RedisKeys.BRUSH_PROOF.join(url, ip);
if(!securityRedisService.isAllowBrush(key)){
//表示已经超频率:
//比如某个ip频繁出现超频现象, 一些额外的处理黑名单
response.setContentType("text/json;charset=UTF-8");
Grid grid = new Grid();
grid.setSuccess(true);
String s = ObjectFactory.getGson().toJson(CommonResult.Msg(500, "请勿频繁访问","谢谢咯"));
response.getWriter().write(s);
return false;
}
return true;
}
}
用到的部分依赖
<!--HandlerInterceptor 防刷用到的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--RedisKey 防刷用到的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>