2010-09-04 123 views
0

当我为所有jsp页面创建过滤器时,浏览器进入无限循环,但是当我仅对一个页面进行过滤时,它将正确运行!为jsp文件使用过滤器时产生无限循环

这里是doFilter方法,如果有一个人找到错误PLX告诉我...

public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
    if (debug) log("AuthenticationFilter:doFilter()"); 
    response.setContentType("text/html"); 
    PrintWriter out = response.getWriter(); 

    HttpServletResponse httpres = (HttpServletResponse) response; 
    HttpServletRequest httpreq = (HttpServletRequest) request; 

    if (httpreq.getRequestURI().indexOf("login.jsp") == -1 || httpreq.getRequestURI().indexOf("LoginServlet") == -1) { 
    // if(!httpreq.getRequestURL().equals("/OSQS/Login.jsp")){ 
     HttpSession session = httpreq.getSession(); 
     String logged = (String) session.getAttribute("login"); 

     if (logged == null) { 
      httpres.sendRedirect("login.jsp"); 
      return; 
     } 
    } 
    chain.doFilter(request, response); 

} 

回答

3

这个问题的原因是,该过滤器的url-pattern显然过于笼统,例如/*或者也许*.jsp。它将在每个 JSP请求上执行

在过滤器中,当登录用户不在时,将发送重定向到login.jsp。重定向将指示客户端发起新的HTTP请求。当请求URL匹配其url-pattern时,新的HTTP请求将再次调用过滤器。由于登录用户仍然不在,它进入无限重定向循环。

除了确定请求URL(与您一样)之外,您还可以将受保护的页面放置在更具体的url-pattern(例如, /secured/*,/private/*左右,然后将受保护的页面放置在那里,但不是登录页面。如果您重定向到登录页面,则不会再调用该过滤器。

+0

thanx它的工作浏览器没有进入无限循环,并显示登录页面,但是当我在URL中更改为private/secure.jsp它进入无限循环:(并没有重定向到登录页面!!为什么? – palAlaa 2010-09-04 23:46:05

+0

可能你还有一个安全文件夹的登录页面吗?你是否将sendRedirect(“login.jsp”)更改为'sendRedirect(“/ login.jsp”)'? – BalusC 2010-09-04 23:48:47

+0

我发现的问题是,如果他没有登录???我不知道为什么,因为我确保从数据库连接,然后使session.setAttribute(“登录”,“确定”)后,在servlet中获得会话形式的http请求;我在过滤器检查,这里: 字符串记录=(字符串)session.getAttribute(“登录”); 但我震惊,用户得到会话属性登录=确定,但他没有登录!!!!!!!! !!!!!!!!!!!!! – palAlaa 2010-09-05 00:13:24