1

私は3つの異なるソースからデータを受け取るWebアプリケーション(実際には単なるサーブレットです)を持っています:

  • ソース A は UTF-8 で記述された HTML ドキュメントであり、 経由でデータを送信します<form method="get">
  • ソース B は ISO-8859-1 で記述されており、 経由でもデータを送信します<form method="get">
  • ソース C は ISO-8859-1 で記述され、 経由でデータを送信します<a href="http://my-servlet-url?param=value&param2=value2&etc">

サーブレットはリクエスト パラメータを受け取り、UTF-8 を使用してそれらを URL デコードします。ご想像のとおり、A は問題なく動作しますが、B と C は失敗します (ISO-8859-1 でエンコードされているものを UTF-8 で URL デコードすることはできません...)。

B と C を少し変更することはできますが、ISO-8859-1 から UTF-8 に変更することは許可されていません。これにより、すべての問題が解決されます。

B では、 に追加することで問題を解決できましaccept-charset="UTF-8"<form>。そのため、ページが ISO であっても、データは UTF-8 で送信されます。

Cを修正するにはどうすればよいですか?

または、サーブレットの文字セットを特定する方法はありますか?それぞれの場合に適切なエンコーディングで URL デコードを呼び出すことができますか?


編集:私はちょうどこれを見つけまし。これは私の問題を解決するようです。パフォーマンスに影響を与えるかどうかを判断するために、まだいくつかのテストを行う必要がありますが、その解決策に固執すると思います.

4

2 に答える 2

3

ブラウザーはデフォルトで、要求されたページが返されたときと同じエンコーディングでデータを送信します。これは、HTMLタグContent-Typeを使用して設定できる HTTP ヘッダーによって制御できます。<meta>

accept-charsetMSIE では壊れているため、HTML要素の属性は<form>避ける必要があります。ほとんどすべての非 UTF-8 エンコーディングは無視され、プラットフォームの既定のエンコーディング (Windows の場合は通常 CP-1252) で送信されます。

AとB(POST)を修正するには、基本的にHttpServletRequest#setCharacterEncoding()リクエストパラメータを収集する前に設定する必要があります。これは 1 回限りの作業であることに注意してください。パラメータを取得してエンコーディングを変更し、パラメータを「再取得」することはできません。

C (GET) を修正するには、基本的にサーバー構成でリクエスト URI エンコーディングを設定する必要があります。使用しているサーバーが不明なため、Tomcat を対象とした例を次に示します。HTTP コネクタで次の属性を設定します。

<Connector (...) URIEncoding="ISO-8859-1" />

ただし、これはほとんどのサーバーで既にデフォルトのエンコーディングになっています。したがって、C については何もする必要がないかもしれません。

HttpServletRequest#getInputStream()別の方法として、リクエスト本文 (POST の場合)から、またはクエリ文字列 (GET の場合) から未加工の URL エンコードされていないデータを取得し、利用可能な文字に基づいて自分でエンコーディングHttpServletRequest#getQueryString()推測することができます。パラメータに入力し、推測されたエンコーディングを使用してそれに応じてURL エンコードします。UTF-8 と ISO-8859-1 の両方で異なる特定の文字を持つ非表示の入力要素は、これに大いに役立ちます。

于 2010-05-28T11:20:30.593 に答える
0

質問を解決済みとしてマークするために、私は自分自身に答えています:

私が直面していたのとまったく同じ問題をカバーするこの質問を見つけました。これjavax.servlet.Filterが私にとっての解決策でした。

于 2011-02-13T21:23:10.430 に答える