アプリケーションは単純な JSP/サーブレット アプリケーションです。(BASIC 認証を使用して) ユーザー認証を実行したいのですが、ユーザーが認証された場合は、SSL (つまり https) を使用してホーム画面にリダイレクトします。ボタンをクリックすると、BASIC 認証が実行される必要があります。
これを達成するために; 最初に、次のように web.xml で BASIC 認証を構成しました。
<security-role>
<role-name>Admin</role-name>
</security-role>
<security-role>
<role-name>Guest</role-name>
</security-role>
<security-constraint>
<web-resource-collection>
<web-resource-name>BasicDemo</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>Admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
コードのユーザー BASIC 認証部分は完全に機能します (ユーザー名とパスワードを求めるポップアップ ダイアログが表示され、正常に機能します)。
次に、次の手順に従って SSL を構成しました。
1) keytool を使用してキーストアを生成
2) server.xml に以下のエントリを追加しました。
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="${user.home}/.keystore"
keystorePass="password" />
3) これを web.xml 内の
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
アプリケーションを実行する際に、私が抱えている問題は次のとおりです。
1) ボタンをクリックしても (BASIC 認証を実行する必要があります)、認証のダイアログが表示されませんでした (ユーザー名とパスワードを要求する BASIC 認証の場合に表示されます)。
2) GET を使用して https のリンクにリダイレクトされました (はい、https が URL に表示されます)。サーブレットの doGet() メソッドが実行されます。これは、送信ボタンのフォームがこのようなものであるため、間違っています。 doGet ではなく実行:
<form action="CentralController" method="post">
私の側の間違いの1つは、認証にGETではなくPOSTを使用している可能性がありますが、それでもうまくいくはずだと思います。何かが欠けている可能性があるため、うまくいきません。問題がどこにあり、それを解決して期待どおりの結果を得る方法を教えてください。
編集
web.xmlのサーブレット定義
<servlet>
<servlet-name>CentralController</servlet-name>
<servlet-class>com.controller.CentralController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CentralController</servlet-name>
<url-pattern>/CentralController</url-pattern>
</servlet-mapping>
これは次の形式です。
<form action="CentralController" method="post">
<input type="submit" value="Submit" name="submit">
</form>