2

リダイレクトに問題があります。有効なパスでは機能しません。現在、サーブレットでページ転送を使用していますが、フィルターでリダイレクトが必要です。

すべてのページは「pages」フォルダーにあり、拡張子は .jspx です。

私は次のことを試しました(このパスは転送で機能します):

httpResponse.sendRedirect("/pages/login.jspx");

ブラウザの URL はhttp://[localhost]/pages/login.jspxで、Tomcat の 404 ページが表示されます。コンテキスト パス (私の場合は「/hotel」) が URL にないため、追加すると:

httpResponse.sendRedirect("/hotel/pages/login.jspx");

リダイレクトは発生せず、ブラウザの URL は変更されず、ブラウザの 404 ページが表示されます (このプログラムでは Web ページを表示できません)。

私は何を間違っていますか?

これをテストするために使用されるフィルターには、次のマッピングがあります。

@WebFilter(filterName = "SecurityFilter", urlPatterns = "/*")
4

2 に答える 2

2

リダイレクトされた URL は、実際には、最初に要求された URL に関連しています。コンテキスト パスを動的HttpServletRequest#getContextPath()に追加するには、ハードコーディングする代わりに使用することをお勧めします。これは、コンテキスト パスの値がサーバー固有の構成によって外部から変更される可能性があるためです。

あなたの具体的な問題については、「ブラウザの 404 ページ」を正しく理解しているかどうかわかりません。おそらく、サーバーに到達できない場合、またはリクエストが無限ループでリダイレクトされた場合に発生するブラウザのデフォルトのエラー ページを意味します (ただし、これはブラウザのデフォルト エラー ページの実際のメッセージで明確にする必要がありました。少なくとも Chrome と Firefox ではそうしています)。

フィルタが にマップされて/*いる場合、ログイン ページのリクエスト URL もフィルタの URL パターンと一致するため、実際には無限ループでリダイレクトされます。

ログイン ページをカバーしない、より具体的な URL パターンにフィルタを配置する必要があります次のようにフィルターを修正します。/secured/*/pages/*

String loginURL = request.getContextPath() + "/pages/login.jspx";

if (needsToRedirect && !request.getRequestURI().equals(loginURL)) {
    response.sendRedirect(loginURL);
}
else {
    chain.doFilter(request, response);
}
于 2012-06-06T15:30:27.373 に答える
1

1-サーブレットコードに、確実に実行されていることを確認するロギングまたはその他の観察可能なイベントがありますか?

2-リダイレクトの前に実際の応答コンテンツを書き込むと、リダイレクトが失敗する可能性があります-何かしていることはありますか?

3-別のオプションとして、ルートディレクトリにページ(「hello.html」静的ページも設定)を設定し、「/hello.html」と「hello.html」のいずれかを使用してそのページにリダイレクトできるかどうかを確認します。

私自身のデバッグアプローチで使用するいくつかのアイデア、何かが役立つことを願っています!

于 2012-06-06T15:25:04.520 に答える