不用使用过滤器,过滤器实现不允许IP地址等登陆还可以.
不允许用户不经过登陆直接使用网页应该使用HttpSession.
例如 在登陆时保存Sessin
  HttpSession session=request.getSession();
  session.setAttribute("user",user);
这样在用户访问一个网页就检查HttpSession中是否保存的用户名.
就可以判断是否经过安全验证了.
  HttpSession session=PageContext.getSession();
  if ((session!=null)&&(session.getAttribute(user)!=null))
  {
    //合法
  }
  else
  {
   //非法
  }

解决方案 »

  1.   

    把url地址作为过滤器的参数,每当通过url访问资源时,都要经过过滤器,过滤器可以控制是否处于登录状态等。
      

  2.   

    写一个类
    public class SessionTimeoutException extends RuntimeException{    /**
         * 
         */
        public SessionTimeoutException() {
            super();
            // TODO Auto-generated constructor stub
        }    /**
         * @param message
         * @param cause
         */
        public SessionTimeoutException(String message, Throwable cause) {
            super(message, cause);
            // TODO Auto-generated constructor stub
        }    /**
         * @param message
         */
        public SessionTimeoutException(String message) {
            super(message);
            // TODO Auto-generated constructor stub
        }    /**
         * @param cause
         */
        public SessionTimeoutException(Throwable cause) {
            super(cause);
            // TODO Auto-generated constructor stub
        }
        
        }然后struts配置文件里面定义一个全局异常,其他要用的地方也可以抛出到这个类上面来
      

  3.   

    你的filter需要判断一下url资源是什么。根据url resouce做出相应的判断。
    一般来说是限制对action的访问,这样需要加个判断。
    boolean pass=true;
    String path =request.getRequestURL().toString();
    if(path.endWith(".do")){//是对action的访问
      String logonFlag=(String)req.getSession().getAttribute("isLogon");
      pass = (logonFlag != null) && (logonFlag.equals("true")));
    }
    if(pass){
      chain.doFilter(request,response);
    }else{
      res.sendRedirect( request.getContextPath() + "/ibatisRecall/error.jsp");
    }
    你可以参考一下acegi的实现。
    比如说,有以下安全配置:
    /index.jsp=AUTH_ANONYMOUS,AUTH_USER
    /**/*.js=AUTH_ANONYMOUS,AUTH_USER
    /**/*.do=AUTH_USER
    /**=AUTH_USER
    AUTH_ANONYMOUS表示匿名用户,AUTH_USER表示登陆用户
    根据url进行正则匹配,不过那就比较复杂了。