Web アプリケーションから 401 エラー コードを返して基本認証プロセスを開始しようとしていますが、Tomcat が応答をハイジャックしてステータス レポート ページを表示しています。Tomcat がこれを実行するのを防ぎ、エラー コードをブラウザに送信する方法はありますか?
更新私の間違い: WWW-Authenticate ヘッダーを忘れました
応答ステータスを 401 に設定すると、ブラウザーに「禁止」と通知されるだけで、Tomcat はエラー ページを表示します。それ自体は認証プロセスをトリガーしません。
認証をトリガーするには、応答に別のヘッダーを追加する必要があります。
httpResponse.setHeader("WWW-Authenticate", "Basic realm=\"MyApp\"");
ここで、「MyApp」は目的の HTTP 認証レルムの名前です。そのヘッダーを追加すると、ブラウザは認証ダイアログをポップアップしてリクエストを再試行します。
Tomcat はヘッダーとともにエラー ページを送信することに注意してください。これは、応答に auth ヘッダーが含まれている限り、ブラウザーに表示されないということです。
Tomcatに付属しているデフォルトのエラーページに不満がありますか?web.xmlファイルで独自のカスタムエラーページを定義できます。以下に示す例では、サーバーでエラー500またはエラー404が発生したときに表示される2つのWebページ(server_error.htmlとfile_not_found.html)を定義しています。
<error-page>
<error-code>500</error-code>
<location>/server_error.html</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/file_not_found.html</location>
</error-page>
ただし、web.xmlファイルのタグの順序は非常に重要であることに注意してください。web.xmlファイルの順序が正しくない場合、Tomcatは起動時にエラーを出力します
ソース: http: //linux-sxs.org/internet_serving/c581.html
Tomcat のエラー ページが表示されるのは、ブラウザが次に必要な処理を行うのに十分な情報が含まれていないためです。ページが表示されていますが、ステータス コード 200 はありません。ヘッダーを調べると、そこに 401 が表示されます。次に何をすべきかわからないのは、あなたのブラウザだと思います。
質問では、ブラウザーに何をさせたいかは述べていませんが、401 エラー メッセージの HTTP ヘッダーに追加情報を含める必要があるかもしれません。error-page
web.xml ファイルにノードを追加することで、デフォルトのエラー メッセージをオーバーライドできます。場所はサーブレットまたは JSP にすることができるため、単なる静的ページではなく、いくつかのロジックを提供できます。
<error-page>
<error-code>401</error-code>
<location>/my401.jsp</location>
</error-page>
上記の答えは100%明確ではないので、これが私を助けてくれました. 静的な 401.html ページがあり、元のポスターと同じ問題が発生しました。私がしたことは、ページを 401.jsp ページに変更し、これを一番上にダンプすることだけでした:
<%
String realmName = "A nice name to show as the title of on the pop-up";
response.setHeader("WWW-Authenticate","Basic realm=\"" + realmName + "\"");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
%>
codeanch.comの次の投稿がガイダンスとして役立ちました。
つまり、web.xml の関連セクションは次のようになります。
<!-- Internal server error. -->
<error-page>
<error-code>500</error-code>
<location>/errors/500.html</location>
</error-page>
<!-- Not found. -->
<error-page>
<error-code>404</error-code>
<location>/errors/404.html</location>
</error-page>
<!-- Unauthorized. -->
<error-page>
<error-code>401</error-code>
<location>/errors/401.jsp</location>
</error-page>
401.jsp は次のようになります。
<%
String realmName = "A nice name to show as the title of on the pop-up";
response.setHeader("WWW-Authenticate","Basic realm=\"" + realmName + "\"");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>401 Unauthorized</title>
<meta name="description" content="The server has not found anything matching the Request-URI.">
<style type="text/css">
body {background-color:ffffff;background-image:url(http://);background-repeat:no-repeat;background-position:top left;background-attachment:fixed;}
h3{font-family:Arial;color:000000;}
p {font-family:Arial;font-size:14px;font-style:normal;font-weight:normal;color:000000;}
</style>
</head>
<body>
<h3>401 Unauthorized</h3>
<p>The request requires authentication.</p>
</body>
</html>
これには、なぜ web.xml のlogin-config、security-constraint、security-role要素を使用しないのでしょうか? ちょっとした例:
<login-config>
<auth-method>FORM</auth-method>
<realm-name>Your-Name</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error_login.xhtml</form-error-page>
</form-login-config>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>Some-Name</web-resource-name>
<url-pattern>/path/to/directory/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>USER</role-name>
<role-name>ADMIN</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<description>Role for all users</description>
<role-name>USER</role-name>
</security-role>
<security-role>
<description>role for all admins</description>
<role-name>ADMIN</role-name>
</security-role>
/path/to/directory/ またはそのサブディレクトリにアクセスしたいユーザーは、ログインする必要があります。アクセスは、ユーザーがロール USER または ADMIN を持っている場合にのみ許可されます。すべてのユーザーが最初にログインする必要があるように、これをルート ディレクトリに設定することもできます。