这里,
httpResponse.sendRedirect("login.jsp");您将向目标页面发送 新的
HTTP请求,而不是使用当前请求。如果此新的HTTP请求被映射到过于通用的网址格式(例如),则当然会再次点击过滤器
/*。并且将执行相同的检查,并将其再次重定向。Etcetera。这是一个永无止境的故事。
FilterChain#doFilter()当当前请求的页面是登录页面时,您需要添加额外的检查才能执行。
String loginURL = httpRequest.getContextPath() + "/login.jsp";if (httpRequest.getRequestURI().equals(loginURL)) || session.getAttribute("userName") != null) { chain.doFilter(request, response);} else { httpResponse.sendRedirect(loginURL);}请注意,我还删除了对作为用户名的空字符串进行的无意义的检查(但是, 您 要确保 您的
代码无处将空字符串作为用户名。仅用于
null表示未登录的用户。还要注意,我修复了也重定向URL,因为当当前请求的URL在子文件夹中时,URL将会失败。
一种不同的方法是把在一个共同的子文件夹中的所有那些受限网页,例如
/app,
/secured,
/restricted等,并然后映射滤波器上的URL模式
/app/*,
/secured/*,
/restricted/*等代替。如果将登录页面保留在此文件夹之外,则在请求登录页面时将不会调用过滤器。



