您现在的位置是:网站首页 > 技术专栏

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

luotf 80人围观
简介在开发本站时,很多时候用户都是连续请求服务器,给服务器造成很大的压力。本文介绍使用springMVC来防止用户连续刷新页面。在对应请i去方法上添加注解即可。
@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次 


转载:感谢您对luotf个人博客网站平台的认可,及对该作品以及文章的青睐,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处。本文章部分图片、文章来源于网络,版权归原作者所有,如有侵权,请与我联系删除。

上一篇: Executors框架

下一篇: git常用操作总结

文章评论

本栏推荐

Top