防止网站恶意刷新

 

import java.io.IOException; 
import java.util.concurrent.ConcurrentHashMap; 
import java.util.concurrent.CopyOnWriteArrayList; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 


public class RefreshFilter implements Filter { 

@Override
 public void doFilter(ServletRequest request, ServletResponse response, 
 FilterChain chain) throws IOException, ServletException { 

 filter((HttpServletRequest) request,(HttpServletResponse) response, chain); 
}

 private void filter(HttpServletRequest request, HttpServletResponse response, 
 FilterChain chain) throws IOException, ServletException { 

 String requestURI = request.getRequestURI(); 
 Cache cache = Cache.getInstance(); 
cache.increment(requestURI);
 if(cache.isUpCount(requestURI)) { 
response.getWriter().println("到达次数,不允许请求,请稍候再试");
return;
}
 chain.doFilter(request, response); 
}




@Override
 public void destroy() { 

}

@Override
 public void init(FilterConfig config) throws ServletException { 

}

//缓存
 private static class Cache { 

 private static final ConcurrentHashMap<String, CopyOnWriteArrayList<Long>> map = new ConcurrentHashMap<String, CopyOnWriteArrayList<Long>>(); 
 private static final long EXPIRE_TIME = 1000 * 20L; 
 private static final long CLEAR_TIME = 1000 * 2L; 
 private static final int MAX_REFRESH_COUNT = 20; 

 private static final Cache cache = new Cache(); 

 private Cache() { 
 new Thread(new ClearCacheRunnable()).start(); 
}

 public static Cache getInstance() { 
 return cache; 
}


//增长指定URL的点击次数
 public void increment(String key) { 
 CopyOnWriteArrayList<Long> list = map.get(key); 
 if(list == null) { 
 map.put(key, new CopyOnWriteArrayList<Long>()); 
}
 map.get(key).add(new Long(System.currentTimeMillis())); 
}

//是否到达指定数量
 public boolean isUpCount(String key) { 
 CopyOnWriteArrayList<Long> list = map.get(key); 
 if(list == null) { 
 return false; 
}
 return list.size() > MAX_REFRESH_COUNT; 
}

//清理过期数据线程
 private static class ClearCacheRunnable implements Runnable { 
@Override
 public void run() { 
 while(true) { 
 try { 
Thread.sleep(Cache.CLEAR_TIME);
clear();
 } catch (InterruptedException e) { 
e.printStackTrace();
}
}
}

 private void clear() { 
 for(String key : map.keySet()) { 
 CopyOnWriteArrayList<Long> list = map.get(key); 
 for(Long date : list) { 
 if(System.currentTimeMillis() - date > Cache.EXPIRE_TIME) { 
System.out.println(list.remove(date));
}
}
}
}
}
}


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JWT(JSON Web Token)是一种用于身份验证和授权的开放标准。它可以通过数字签名来验证数据的可靠性,防止恶意登录。以下是一些JWT如何防止恶意登录的方法: 1. 使用安全算法:JWT使用算法对令牌进行签名,以确保令牌的完整性和真实性。选择强大的加密算法(如HMACSHA256或RSA)可以增加令牌的安全性。 2. 限制令牌的存储时间:在JWT中可以设置令牌的过期时间。将过期时间设置为较短的时间段可以限制恶意用户长时间持有有效令牌。 3. 使用刷新令牌:刷新令牌是一种特殊类型的JWT,用于获取新的访问令牌。当访问令牌过期时,可使用刷新令牌来获取新的访问令牌,而无需用户重新进行身份验证。刷新令牌应该具有更短的过期时间,并且只在安全的方式下传输。 4. 避免在令牌中存储敏感信息:JWT中的负载部分可以存储一些用户信息,但应避免在其中存储敏感信息(如密码)。只存储必要的用户标识,对于敏感信息应该进行额外的保护,例如使用安全的HTTPS通信。 5. 使用黑名单/白名单:为了防止在令牌被盗用后仍然有效,可以在服务器端维护一个黑名单,记录已失效的令牌。当收到请求时,先检查令牌是否在黑名单中,如果在则拒绝请求。类似地,也可以使用白名单来限制只有特定的令牌才能访问某些资源。 6. 强化访问控制:除了JWT本身的安全性,还应该在应用程序中实施其他访问控制措施。例如,通过使用角色和权限管理,限制用户对敏感资源的访问。 总而言之,JWT本身提供了一些安全性保护措施,但在实际应用中还需要结合其他安全措施来防止恶意登录。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值