为JavaWeb应用程序增加入侵检测功能

来源:java认证发布时间:2012-11-12 12:48:46java认证视频


  三、监控线程UserConnectManage.java类
  这是入侵检测的核心部分,主要实现具体的入侵检测、记录、判断用户信息、在线用户的刷新等功能,并提供其它应用程序使用本组件的调用接口。
  package com.easyjf.web;
  import java.util.Date;
  import java.util.HashMap;
  import java.util.HashSet;
  import java.util.Iterator;
  import java.util.Map;
  import java.util.Set;
  import org.apache.log4j.Logger;
  /**
  *
  *
  Title:用户入侵检测信息
  *
  Description:用于判断用户刷新情况检查,默认为10秒钟之内连续连接10次为超时
  public class UserConnectManage {
  private static final Logger logger = (Logger) Logger.getLogger(UserConnectManage.class.getName());
  private static int maxFailureTimes=10;//最大登录失败次数
  private static long maxFailureInterval=10000;//毫秒,达到最大登录次数且在这个时间范围内
  private static long waitInterval=60000;//失败后接受连接的等待时间,默认1分钟
  private static int maxOnlineUser=200;//同时在线的最大数
  private final static Map users=new HashMap();//使用ip+userName为key存放用户登录信息UserLoginAuth
  private static Thread checkThread=null;
  private static class CheckTimeOut implements Runnable{
  private Thread parentThread;
  public CheckTimeOut(Thread parentThread)
  {
  this.parentThread=parentThread;
  synchronized(this){
  if(checkThread==null){
  checkThread= new Thread(this);
  //System.out.println( "创建一个新线程!");
  checkThread.start();
  }
  }
  }
  public void run() {
  while(true)
  {
  if(parentThread.isAlive()){
  try{
  Thread.sleep(2000);
  int i=0;
  if(users.size() >maxOnlineUser)//当达到最大用户数时清除
  {
  synchronized(users){//执行删除操作
  Iterator it=users.keySet().iterator();
  Set set=new HashSet();
  Date now=new Date();
  while(it.hasNext())
  {
  Object key=it.next();
  UserConnect user=(UserConnect)users.get(key);
  if(now.getTime()-user.getFirstFailureTime().getTime() >maxFailureInterval)//删除超时的用户
  {
  set.add(key);
  logger.info( "删除了一个超时的连接"+i);
  i++;
  }
  }
  if(i <5)//如果删除少于5个,则强行删除1/2在线记录,牺牲性能的情况下保证内存
  {
  int num=maxOnlineUser/2;
  it=users.keySet().iterator();
  while(it.hasNext() && i
  {
  set.add(it.next());
  logger.info( "删除了一个多余的连接"+i);
  i++;
  }
  }
  users.keySet().removeAll(set);
  }
  }
  }
  catch(Exception e)
  {
  e.printStackTrace();
  }
  }
  else
  {
  break;
  }
  }
  logger.info( "监视程序运行结束!");
  }
  }
  //通过checkLoginValidate判断是否合法的登录连接,如果合法则继续,非法则执行
  public static boolean checkLoginValidate(String ip,String userName)//只检查认证失败次数
  {
  boolean ret=true;
  Date now=new Date();
  String key=ip+ ":"+userName;
  UserConnect auth=(UserConnect)users.get(key);
  if(auth==null)//把用户当前的访问信息加入到users容器中
  {
  auth=new UserConnect();
  auth.setIp(ip);
  auth.setUserName(userName);
  auth.setFailureTimes(0);
  auth.setFirstFailureTime(now);
  users.put(key,auth);
  if(checkThread==null)new CheckTimeOut(Thread.currentThread());
  }
  else
  {
  if(auth.getFailureTimes() >maxFailureTimes)
  {
  //如果在限定的时间间隔内,则返回拒绝用户连接的信息
  if((now.getTime()-auth.getFirstFailureTime().getTime())
  {
  ret=false;
  auth.setStatus(-1);
  }
  else if(auth.getStatus()==-1 && (now.getTime()-auth.getFirstFailureTime().getTime()< (maxFailureInterval+waitInterval)))//重置计数器
  {
  ret=false;
  }
  else
  {
  auth.setFailureTimes(0);
  auth.setFirstFailureTime(now);
  auth.setStatus(0);
  }
  }

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答