springMVC自定义注解拦截恶意请求

@Retention(RUNTIME) 
@Target(METHOD)
public @interface AccessLimit {

int seconds() default 5
int maxCount() default 2
}
public class RequestIp{

private String ip ;
    private long createTime;
    private Integer reCount;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public long getCreateTime() {
return createTime;
}
public void setCreateTime(long createTime) {
this.createTime = createTime;
}
public Integer getReCount() {
return reCount;
}
public void setReCount(Integer reCount) {
this.reCount = reCount;

}
}
public class AccessInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
}
@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;
   }
response.setCharacterEncoding("UTF-8"); 
// 取用户的真实IP
String ip =UserIpUtil.getIp(request);
// 取session中的IP对象
RequestIp re = (RequestIp) request.getSession().getAttribute(ip);
// 第一次请求
if (null == re) {
// 放入到session中
RequestIp reIp = new RequestIp();
reIp.setCreateTime(System.currentTimeMillis());
reIp.setReCount(1);
request.getSession().setAttribute(ip, reIp);
} else {
Long createTime = re.getCreateTime();
if (null == createTime) {

} else {
if(((System.currentTimeMillis()-createTime)/1000)>accessLimit.seconds()) {
// 当前时间离上一次请求时间大于3秒,可以直接通过,保存这次的请求
RequestIp reIp = new RequestIp();
reIp.setCreateTime(System.currentTimeMillis());
reIp.setReCount(1);
request.getSession().setAttribute(ip, reIp);
} else {
// 小于3秒,并且3秒之内请求了15次,返回提示
if (re.getReCount() > accessLimit.maxCount()) {
return false;
} else {
// 小于3秒,但请求数小于15次,给对象添加
re.setCreateTime(System.currentTimeMillis());
re.setReCount(re.getReCount() + 1);
request.getSession().setAttribute(ip, re);
}
}
}}
}
return true;
}
}
     在对应的方法头部添加:
@AccessLimit(seconds=1,maxCount=15
   表示该方法一秒钟限制请求15次 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpongo11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值