底下我的filter,为什么我直接访问一个权限的页面时,总是不停地运行: System.out.println("被SignonFilter拦截一个未认证的请求");
输出“被SignonFilter拦截一个未认证的请求”
为什么hres.sendRedirect("login.jsp");这一句没有执行呢,页面始终没有跳转
public class SignonFilter implements Filter
{
String LOGIN_PAGE="login.jsp";
protected FilterConfig filterConfig;

//过滤处理的方法
public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)throws IOException,ServletException
{
 HttpServletRequest hreq = (HttpServletRequest)req;
         HttpServletResponse hres = (HttpServletResponse)res;
         HttpSession session = hreq.getSession();
         String isLogin="";
         try
         {
          isLogin=(String)session.getAttribute("isLogin");        
            System.out.print(isLogin);
 if(isLogin!=null&&isLogin.equals("true"))
 {
  System.out.println("在SignonFilter中验证通过");
  //验证成功,继续处理
  chain.doFilter(req,res);
 }
 else
 {
  //验证不成功,让用户登录。
  hres.sendRedirect("login.jsp");    
         System.out.println("被SignonFilter拦截一个未认证的请求");
 }
 
 }
         catch(Exception e)
         {         
          e.printStackTrace();
         }
 
}

public void setFilterConfig(final FilterConfig filterConfig)
{
this.filterConfig=filterConfig;
}
    
    //销毁过滤器
public void destroy()
{
this.filterConfig=null;
}
 /**
     *初始化过滤器,和一般的Servlet一样,它也可以获得初始参数。
     */
    public void init(FilterConfig config) throws ServletException {
        this.filterConfig = config;       
    }

}

解决方案 »

  1.   

    检查你的相对路径下是否有login.jsp文件,其它的想不出什么原因了
      

  2.   

    是不是你的过滤器是全局的?
    如果是全局的,那么当你进入“login.jsp”中的时候同样会进入该过滤器,因此陷入死循环了。
      

  3.   

    加上个判断,如果该过滤器加在了login.jsp页面上(从request中得到请求的页面,看看是不是login),就不要进行权限验证了。
      

  4.   

    应该事死循环了
    JSP过滤吗?
      

  5.   

    这是配制:
    <?xml version="1.0" encoding="ISO-8859-1"?><web-app xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
        version="2.4">  <display-name>Welcome to Tomcat</display-name>
      <description>
         JSP应用开发详解
      </description>  
        
        <filter>
         <filter-name>auth</filter-name> 
               <filter-class>com.jspdev.ch8.SignonFilter</filter-class> 
        </filter>
         
        <filter-mapping> 
           <filter-name>auth</filter-name> 
           <url-pattern>/security/*</url-pattern>  
       </filter-mapping>
         
    </web-app>
    这个应该不是全局吧
      

  6.   

    test目录底下是security,WEB-INF文件夹
    login.jsp,login_signon.jsp文件
    security目录下有index.jsp
      

  7.   

    进入了security以后,路径就不是"login.jsp"了吧?是不是应该用"/login.jsp"
      

  8.   

    我说错了,应该是 "/环境名+/login.jsp"
      

  9.   

    谢谢大家,死循环已经解决,我按楼上的做了就好了,但不知怎么会出现死循环呢!
    还有一个问题就是:
    我在浏览器里直接输入http://127.0.0.1:8080/test/security/index.jsp时出现
    java.lang.NullPointerException异常不能运行下去,是不是由于(String)session.getAttribute("isLogin");
    返回null的原因呀,可这个filter不就是用来防止直接访问限制页面吗?
      

  10.   

    死循环是想通了,但是我在浏览器里直接输入http://127.0.0.1:8080/test/security/index.jsp时出现
    java.lang.NullPointerException异常不能运行下去,这个是不是由于这个时候session还没有创建呀,那我要防止直接在浏览器里面访问某个网页怎么用filter呀,
      

  11.   

    问题已经彻底想通了,谢谢大家了,出现空指针错误是由于(String)session.getAttribute("isLogin")返回isLogin为null而底下判断时又使用了isLogin.equals()所以出现空指针错误了!
      

  12.   

    呵呵,来晚了,郁闷中。其实就是你的chain.doFilter(req,res);
    放的地方不对。