importcom.alibaba.fastjson.JSON;importcom.emi2c.mybatis.config.annotation.AccessLimit;importcom.emi2c.mybatis.util.RedisUtil;importcom.emi2c.mybatis.util.ResultUtil;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importorg.springframework.web.method.HandlerMethod;importorg.springframework.web.servlet.handler.HandlerInterceptorAdapter;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.OutputStream;importjava.util.Map;importjava.util.Objects;
@Componentpublic class AccessInterceptor extendsHandlerInterceptorAdapter {private Logger logger = LoggerFactory.getLogger(this.getClass());
@AutowiredprivateRedisUtil redisUtil;
@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throwsException {//判断请求是否属于方法的请求
if(handler instanceofHandlerMethod) {
HandlerMethod handlerMethod=(HandlerMethod) handler;//获取方法中的注解,看是否有该注解
AccessLimit accessLimit = handlerMethod.getMethodAnnotation(AccessLimit.class);if(accessLimit == null) {return true;
}//单位时间
int seconds =accessLimit.seconds();//访问次数
int maxCount =accessLimit.maxCount();//是否需要登陆
boolean needLogin =accessLimit.needLogin();
String key=request.getRequestURI();
logger.info("访问地址: {}", key);//是否需要登陆
if(needLogin) {
String username= request.getHeader("username");
key= key + "-" +username;
}//已访问次数
Object o =redisUtil.get(key);if(Objects.isNull(o)) {//第一次访问
redisUtil.incr(key, 1);
redisUtil.expire(key, seconds);
}else{//获取单位时间内已访问次数
Integer count =Integer.valueOf(redisUtil.get(key).toString());if(maxCount >count) {//没超出访问限制
redisUtil.incr(key, 1);
}else{//超出访问限制
logger.info("访问次数超出限制");
Map failure = ResultUtil.getFailure(200, "访问次数超出限制");
render(response, failure);return false;
}
}
}return true;
}/*** 封装消息
*@paramresponse
*@parammessage
*@throwsException*/
private void render(HttpServletResponse response, Map message)throwsException {
response.setContentType("application/json;charset=UTF-8");
OutputStream out=response.getOutputStream();
String str=JSON.toJSONString(message);
out.write(str.getBytes("UTF-8"));
out.flush();
out.close();
}
}