当我为所有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);
}
答案 0 :(得分:3)
此问题的原因是过滤器的url-pattern
显然过于通用,例如/*
或*.jsp
。它将在每个 JSP请求上执行。
在过滤器中,当您登录的用户不在时,您将向login.jsp
发送重定向。重定向将指示客户端触发新的HTTP请求。当请求URL与其url-pattern
匹配时,新的HTTP请求将再次调用过滤器。由于登录用户仍然缺席,因此会进入无限重定向循环。
除了确定请求网址(正如您所做的那样)之外,您还可以将受保护的网页放在更具体的url-pattern
上,例如/secured/*
,/private/*
左右,然后将安全页面放在那里,但登录页面没有。如果您重定向到登录页面,则不会再调用过滤器。