分析目的でサーブレットにURLを送信するサイトを構築しています。クライアント側では、エンコードされたパラメーターとしてURLを送信します。例えば...
Submit: http://www.site.com
Goes to: http://localhost/myservlet/?url=http%3A%2F%2Fwww.site.com
サーバー側では、サーブレットに次のようなパラメータを要求させます...
String url = request.getParameter("url");
私が受け取るのはデコードされた文字列です: http://www.site.com 。これまでのところ良好です-これは期待どおりに機能します...ほとんどの場合。
この問題は、URLパラメータに独自のパラメータが含まれている場合に発生します...
Submit: http://www.site.com?param1=1¶m2=2
Goes to: http://localhost/myservlet/?url=http%3A%2F%2Fwww.site.com%3Fparam1%3D1%26param2%3D2
クライアントサイトではすべて問題ありませんが、サーブレットでパラメータを取得すると、URLパラメータの一部しか受信しません。
http://www.site.com?param1=1
入力URLパラメータから2番目のパラメータを削除しました!サーバーに送信する前に、URLパラメータを確実にエンコードしています...何が起こっているのですか?
Tomcat6.0.29で問題を再現できません。問題はもっとあります。たぶん、リクエストオブジェクトで何かをしているチェーンのフィルター?
とにかく、これが [〜#〜] sscce [〜#〜] 単一のJSPのフレーバーです:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Test</title>
</head>
<body>
<p><a href="?url=http%3A%2F%2Fwww.site.com%3Fparam1%3D1%26param2%3D2">click here</a>
<p>URL: ${param.url}
</body>
</html>
'n'貼り付け 'n'実行して、リンクをクリックします。ここに次の結果が表示されます。
ここをクリック
ブラウザのアドレスバーから直接呼び出されるこのような単純なサーブレットでも同じことが再現できます。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write(request.getParameter("url"));
}
ちなみに、TomcatはHTTPコネクタのURIEncoding="UTF-8"
で構成されていますが、ISO-8859-1
(デフォルト)を使用しても、この特定のケースで予想されるように、動作は同じです。