web-dev-qa-db-ja.com

Java URLであるパラメータのサーブレットgetParameter

分析目的でサーブレットに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&param2=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パラメータを確実にエンコードしています...何が起こっているのですか?

9
Michael Balint

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'実行して、リンクをクリックします。ここに次の結果が表示されます。

ここをクリック

URL: http://www.site.com?param1=1&param2=2

ブラウザのアドレスバーから直接呼び出されるこのような単純なサーブレットでも同じことが再現できます。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.getWriter().write(request.getParameter("url"));
}

ちなみに、TomcatはHTTPコネクタのURIEncoding="UTF-8"で構成されていますが、ISO-8859-1(デフォルト)を使用しても、この特定のケースで予想されるように、動作は同じです。

12
BalusC