14

カスタム HTTP ヘッダーが、認証のためにサーブレット アプリケーションに渡されています。ヘッダー値には、アクセントやその他の非 ASCII 文字を含めることができる必要があるため、特定のエンコーディング (理想的には UTF-8) である必要があります。

認証環境を制御する開発者から、次の Java コードが提供されました。

String firstName = request.getHeader("my-custom-header"); 
String decodedFirstName = new String(firstName.getBytes(),"UTF-8");

しかし、このコードは私には正しく見えません: ヘッダー値のエンコーディングを指定する適切な方法があるように思えたときに、ヘッダー値のエンコーディングを前提としています (MIME からだと思います)。

ここに私の質問があります: UTF-8 エンコーディングをサポートする必要があるカスタム ヘッダー値を処理する正しい方法 (tm) は何ですか:

  • ワイヤー上 (ヘッダーがワイヤー上でどのように見えるか)
  • デコードの観点から (Java Servlet API を使用してデコードする方法、および request.getHeader() が既に適切にデコードを行っていると仮定できます)

サービスを変更できない場合にヘッダーを UTF-8 として扱う環境に依存しないコード サンプルを次に示します。

String valueAsISO = request.getHeader("my-custom-header"); 
String valueAsUTF8 = new String(firstName.getBytes("ISO8859-1"),"UTF-8");
4

5 に答える 5

7

繰り返しますが、RFC 2047 は実際には実装されていません。HTTP/1.1 の次の改訂では、それについての言及が削除されます。

そのため、非 ASCII 文字を転送する必要がある場合、最も安全な方法は、Atom Publishing Protocol の「Slug」ヘッダーなど、それらを ASCII のシーケンスにエンコードすることです。

于 2008-12-31T20:24:24.273 に答える
6

すでに述べたように、最初のルックは常にHTTP 1.1 仕様(RFC 2616) に行く必要があります。ISO-8859-1 以外の文字セットの文字が含まれている場合、ヘッダー値のテキストはRFC 2047で定義されている MIME エンコーディングを使用する必要があると書かれています。

だからここにあなたのためのプラスがあります。要件が ISO-8859-1 文字セットでカバーされている場合は、要求/応答メッセージに文字を入れるだけです。それ以外の場合は、MIME エンコーディングが唯一の代替手段です。

ユーザー エージェントがこれらのルールに従ってカスタム ヘッダーに値を送信する限り、それらのデコードについて心配する必要はありません。それが、サーブレット API が行うべきことです。


ただし、コード スニペットが想定どおりに機能しないのには、もっと基本的な理由があります。最初の行は、ヘッダー値を Java 文字列としてフェッチします。私たちが知っているように、内部では UTF8 として表現されているため、この時点で HTTP 要求メッセージの解析は既に完了しています。

次の行は、この文字列のバイト配列をフェッチします。エンコーディングが指定されていないため (引数のないこのメソッドはずっと前に非推奨になっているはずです)、現在のシステムの既定のエンコーディングが使用されます。これは通常 UTF8 ではなく、配列は UTF8 エンコーディングとして再度変換されます。アウト。

于 2008-11-27T20:30:07.650 に答える
5

HTTPbis ワーキング グループはこの問題を認識しており、最新のドラフトでは、TEXT および RFC 2047 エンコーディングに関するすべての言語が取り除かれています。実際には、HTTP では使用されていません。

全体のストーリーについては、http://trac.tools.ietf.org/wg/httpbis/trac/ticket/74を参照してください。

于 2008-12-31T17:16:56.367 に答える
4

ルールについては、セクション 2.2 にあるHTTP 仕様を参照してください。

TEXT ルールは、メッセージ パーサーによって解釈されることを意図していない記述フィールドの内容と値にのみ使用されます。*TEXT の単語には、RFC 2047 [14] の規則に従ってエンコードされた場合にのみ、ISO-8859-1 [22] 以外の文字セットの文字が含まれる場合があります。

上記のコードは RFC2047 エンコーディング文字列を正しくデコードしないため、サービスが仕様に正しく準拠しておらず、生の utf-8 データをヘッダーに埋め込んでいるだけだと思います。

于 2008-11-27T19:54:13.840 に答える
3

答えてくれてありがとう。RFC 2047に準拠した適切なHTTPヘッダーエンコーディングに従うのが理想的なようです。ネットワーク上のUTF-8のヘッダー値は、次のようになります。

=?UTF-8?Q?...?=

ここで面白いことがあります。Tomcat5.5も6もRFC2047に従ってHTTPヘッダーを適切にデコードしていないようです。Tomcatコードは、ヘッダー値がISO-8859-1を使用することをどこでも想定しています。

したがって、Tomcatの場合、具体的には、ヘッダー値の適切なデコードを処理するフィルターを作成することで、これを回避します。

于 2008-12-01T15:34:46.453 に答える