3

アプリケーションは単純な 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>
4

2 に答える 2

3

get / post変換で、シナリオを正しく理解していれば、従来のHTTPリダイレクトの「問題」が発生しています。

非SSL要求でSSLセキュリティ制約に達すると、サーバーはクライアントにHTTP 302応答(リダイレクトとも呼ばれます)をhttpsURLに送信します。このリダイレクトの実装は、すべてのクライアントHTTPスタックでまったく同じではありませんが、基本的にほとんどの場合、元のHTTP動詞(POSTまたはその他)が何であれ、GETを発行することによってリダイレクトが処理されます。

これに関する多くの議論はウィキペディアとそのリンクで見つけることができます http://en.wikipedia.org/wiki/HTTP_302Getの代わりにPOSTを使用したResponse.Redirect も参照してください。およびHTTP:POSTリクエストは302を受信しますが、リダイレクトリクエストはGETである必要がありますか?議論のために。または、一般的にGoogleでは「HTTP302POST」。

悲しい結論は、(この場合はHTTPからHTTPSへの)リダイレクトが送信されたときに、元のリクエストのPOSTの性質が保持されることを期待できないということです。これはブラウザーによって異なり、発行するブラウザーは多数あります。リダイレクトステータスコード(302、307など)を取得します。

上記の最初のリンクで説明されているように、回避策を試してみることもできます。

于 2013-03-06T18:50:25.190 に答える
2

主な質問が 2 つあります。1
) クリックしても基本認証が表示されない
2) doPost の代わりに doGet を押す

このアプリケーションを段階的に作成しましょう.....
1) 2 つの jsp と 1 つのサーブレットを作成します。

index.jsp
<form action="RegisterServlet" method="post">
<input type="submit" name="submit">
</form>
RegisterServlet.java
doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/welcome.jsp");
dispatcher.forward(request,response);
}

2) 基本認証の適用
web.xml
<security-constraint>
<web-resource-collection>
<web-resource-name>BasicAuth</web-resource-name>
<url-pattern>/RegisterServlet</url-pattern>
<http-method>POST</http-method>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>Admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Basic Authentication</realm-name>
</login-config>
<security-role>
<description>Admin Role</description>
<role-name>Admin</role-name>
</security-role>


**RegisterServlet に Basic 認証を提供しました。これにより、index.jsp のフォーム送信時に基本認証が有効になります。<http-method>GET</http-method>同様に追加



tomcat-users.xmlにロールとユーザーを作成する
<role rolename="Admin"/>
<user username="Admin" password="password" roles="Admin"/>



3) web.xml のコードの下で、 <user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
user-data-constraint http から https への呼び出しを行う場合、GET が呼び出されます。これは悪い習慣と見なされるためです。そのため、POST を呼び出すには、アクションでフルパス (url) を指定できます...または https リソースから https にアクセスします。

于 2013-03-06T11:17:47.163 に答える