動的なJSP/サーブレットWebアプリケーションを開発しています。/*
セッションを処理するために、にマップされているフィルターを使用していますweb.xml
。Firefoxでページを開くと、次のFirefox固有のエラーメッセージが表示されます。
Firefoxは、サーバーがこのアドレスの要求を決して完了しない方法でリダイレクトしていることを検出しました
同様のエラーがChromeでも表示されます。これはどのように発生し、どうすれば解決できますか?
動的なJSP/サーブレットWebアプリケーションを開発しています。/*
セッションを処理するために、にマップされているフィルターを使用していますweb.xml
。Firefoxでページを開くと、次のFirefox固有のエラーメッセージが表示されます。
Firefoxは、サーバーがこのアドレスの要求を決して完了しない方法でリダイレクトしていることを検出しました
同様のエラーがChromeでも表示されます。これはどのように発生し、どうすれば解決できますか?
フィルタは、まったく同じ条件でまったく同じフィルタを呼び出しているURLにリダイレクトしているため、新しいリダイレクトなどが発生します。フィルタは基本的に無限ループでそれ自体にリダイレクトされます。Webブラウザーは、不適切に設計されたWebアプリケーションからエンドユーザーを保護するための最大20の要求の後、無限ループをブロックしています。
フィルタがすでに実行されているときにリダイレクトが実行されないように、それに応じてフィルタを修正する必要があります。/*
ユーザーがログインしていないときにログインページにリダイレクトするようにマップされているログインフィルターの基本的な実例を想定してみましょう。これはuser
、セッションの属性によって識別されます。ログインページ自体が現在要求されている場合は、フィルターがログインページにリダイレクトされないようにする必要があります。
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
String loginURL = request.getContextPath() + "/login.jsp";
boolean loggedIn = session != null && session.getAttribute("user") != null;
boolean loginRequest = request.getRequestURI().equals(loginURL);
if (loggedIn || loginRequest) {
chain.doFilter(request, response); // Logged-in user found or already in login page, so just continue request.
} else {
response.sendRedirect(loginURL); // No logged-in user found and not already in login page, so redirect to login page.
}
}
// ...
}
リクエストを許可/続行する場合は、のchain.doFilter()
代わりに電話してresponse.sendRedirect()
ください。リクエストを別の宛先に変更する場合にのみ、リダイレクトを使用してください。