今回は404についてお話します。なぜなら、公式アカウントと QQ グループのバックグラウンドで、人々が同じ質問をしているからです。
私のアプリケーションはデプロイされており、バックグラウンドで起動しても異常な出力は見られませんでした。 Tomcat のマネージャーにリクエストすることはできますが、自分のアプリケーションをリクエストすると常に 404 が返されるのはなぜですか?
ええ、なぜですか?
この問題の説明を分析してみましょう。
1. アプリケーションはデプロイされており、バックグラウンドで異常な出力はありません。
2. Tomcat のマネージャー アプリケーションは正常にリクエストできます
上記の 2 点は、Tomcat が正常に起動し、同時にマネージャー アプリケーションとユーザーのアプリケーションが正常にデプロイされていることを示すだけですが、マネージャーのリクエストは正常であり、そうではありませんあなた自身のアプリケーションも正常であることを保証します。
結局のところ、あなたのアプリ内リソースが何であるかは管理者とは何の関係もなく、リクエストした際のアドレスが間違っている可能性すらあります。つまり、webapps ディレクトリにデプロイされたアプリケーションを監視していますが、ブラウザーでのリクエストは停止することなく常に 404 を返します。
上記の質問が当記事の主な分析内容です。まず、Wikipedia に記載されている 404 HTTP リクエストのステータス コードを見てみましょう:
HTTP エラー メッセージ 404 (Not Found) は、コンピュータ ネットワーク通信における標準の応答コードで、クライアントが通信できることを示します。しかし、サーバーはクライアントが要求したリソースを見つけることができません。
Tomcat では、多くの状況で 404 が返されます。
Tomcat には 2 つのデフォルトのサーブレット、
JspServlet、DefaultServlet が含まれていることは前の記事で述べました。 (Tomcat は静的リソースにどのように応答するのでしょうか?)
次の存在しない 2 つのリソースなど、Tomcat に存在しないリソースをランダムにリクエストした場合:
http://localhost:8080/abc と http: // localhost:8080/abcd.jsp
このとき、上記の 2 つのサーブレットがリクエストされます。現時点ではリソースが存在しないため、戻り値 404 は期待どおりです。
たとえば、DefaultServlet はリクエストを処理するときに、現在リクエストされているリソースが Resource に存在するかどうかを確認します。
ここでキャッシュは現在のアプリケーションのすべてのリソースコンテンツを記録するために使用されます。
はリソース内で見つかりません。下の図は、Tomcat ルート アプリケーション内のリソースを示しています
別の状況を分析してみましょう:
たとえば、マネージャー アプリケーションをリクエストするとき、アプリケーション名は Manager または manageR として記述されます。このとき、プロセスは実際には上記と同様に、このアプリケーション名はこのアプリケーションのリソースとして認識されて処理されるため、そのようなリソースが存在しない場合は当然 404 が返されます。
別の状況を見てください:
マネージャーアプリケーションの下にエラーページ404.jspがありますが、次のフォームで直接リクエストしても404が返されます
http://localhost:8080/manager/ WEB -INF/jsp/404.jsp
別のページを見てみましょう:
アプリケーション内の特定のページは、index.jsp 内にあると仮定すると、基本的に別のページにジャンプします。sendRedirect を使用すれば問題ありません。転送後に特定のパス情報が表示されます。ただし、forward が使用されていると仮定すると、この時点では、転送したページは存在しません。すべてのリクエストは 404 になりますが、リクエストしたページは明らかにディレクトリ内に静かに存在していることがわかります。
そのため、リクエストが 404 を返した場合は、ケースバイケースで状況を分析して、具体的な原因が何か、本当にリソースが見つからないのか、それとも他の理由があるのかを確認する必要があります。 。
404 が表示されるたびに、同じ 404 エラー ページに対応する複数のエラー コードを設定している可能性もあります。