使用过滤器为jsp文件时的无限循环

时间:2010-09-04 22:43:00

标签: java jsp servlets servlet-filters

当我为所有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);

}

1 个答案:

答案 0 :(得分:3)

此问题的原因是过滤器的url-pattern显然过于通用,例如/**.jsp。它将在每个 JSP请求上执行。

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

除了确定请求网址(正如您所做的那样)之外,您还可以将受保护的网页放在更具体的url-pattern上,例如/secured/*/private/*左右,然后将安全页面放在那里,但登录页面没有。如果您重定向到登录页面,则不会再调用过滤器。