http.strictPostRedirect
System Propertyを読み取ろうとしている Java アプレットがあります。
コードは私のものではありません (Java のコードなので、変更できません)。ただし、コードはオンラインで見つけることができます。
HttpURLConnection.java :
if (method.equals("POST") && !Boolean.getBoolean("http.strictPostRedirect") && (stat!=307))
{
/* The HTTP/1.1 spec says that a redirect from a POST
* *should not* be immediately turned into a GET, and
* that some HTTP/1.0 clients incorrectly did this.
* Correct behavior redirects a POST to another POST.
* Unfortunately, since most browsers have this incorrect
* behavior, the web works this way now. Typical usage
* seems to be:
* POST a login code or passwd to a web page.
* after validation, the server redirects to another
* (welcome) page
* The second request is (erroneously) expected to be GET
*
* We will do the incorrect thing (POST-->GET) by default.
* We will provide the capability to do the "right" thing
* (POST-->POST) by a system property, "http.strictPostRedirect=true"
*/
...
}
基本的な失敗は、次の呼び出しから発生します。
Boolean.getBoolean("http.strictPostRedirect")
これは多くの人々の悲しみを引き起こしました。どうやらシステム プロパティの読み取りが許可されていないようです。それを読み取ろhttp.strictPostRedirect
うとすると、 AccessControlExceptionがスローされます。
java.security.AccessControlException: access denied (java.util.PropertyPermission http.strictPostRedirect read)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
at java.lang.System.getProperty(Unknown Source)
at java.lang.Boolean.getBoolean(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.followRedirect(Unknown Source)
したがって、システム プロパティへのアクセス許可を読み取るアクセス許可がない場合:
システム プロパティへの読み取りアクセス許可を取得するにはどうすればよいですか?
明らかに、システム プロパティを読み取る権限を与える設定が必要です。そうしないと、Sun はそれに透過的にアクセスしようとするコードを持たないでしょう。
マシンワールドワイドな設定ですか?ドメイン全体の設定ですか?マシン全体の設定ですか?ユーザーごとの設定ですか?アプレットごとの設定ですか?呼び出しごとの設定ですか?Java Runtime Engineの特定のバージョンに関連付けられた設定ですか?
tl;dr : クラッシュしないようにするにはどうすればよいですか?
システム プロパティの読み取り
Java には、アプレットで読み取れないシステム プロパティのリストがあります。
java.class.path
java.home
user.dir
user.home
user.name
私のシステム プロパティ、http.strictPostRedirect
はそのリストにありません。では、なぜ読めないのでしょうか。
こちらもご覧ください
HttpURLConnection.java
- HttpURLConnection が POST リクエストを GET にリダイレクトする
- サーベットへの投稿時に PropertyPermission 例外がスローされる
- アクセス拒否エラー
- java.security.AccessControlException
- Java アプレットに署名し、クライアントのログオン ユーザーなどのシステム プロパティを読み取る権限を設定する方法
- アプレットがファイルシステムに書き込むためのアクセス許可を与える方法
- Java SecurityManager を使用してシステム機能へのアクセスを許可/拒否する
- Oracle.com - アプレットでできることとできないこと