15

このような方法を持つ:

@GET @Path("/name/{name}")
@Produces(MediaType.TEXT_PLAIN)
public String getProperty(@PathParam("name") String name) {
        System.out.println(name);
}

「test./test」のような値を渡すにはどうすればよいですか?

/name/test./test     gives HTTP 404
/name/test.%2Ftest   gives HTTP 400
/name/test.%252Ftest prints test%2Ftest

しかし、私がそうすると、name = URLDecoder.decode(name);それは印刷/testされ、の最初の部分がtest.消えます。

このような質問はもう1つか2つありますが、古くて良い解決策が見つからなかったので、もう一度質問したいと思いました。

4

4 に答える 4

21

注釈のパターン@Pathは内部で正規表現に変換され、テンプレートパーツはデフォルトで選択された文字のみに一致します。特に、通常は文字と一致しません。/これはほとんどの場合正しいことです(パスの途中にテンプレートを配置できるため)が、この場合は、後続のパス全体を消費したいのでそうではありません。すべてを取得するには、その特定のテンプレートの正規表現フラグメントをオーバーライドする必要があります。これは実際には非常に簡単です。テンプレートフラグメントaの:後に、使用するREを挿入するだけだからです。

@GET @Produces(MediaType.TEXT_PLAIN)
@Path("/name/{name:.+}")
public String getProperty(@PathParam("name") String name) {
    return name;
}

/name/これは、 (クエリ部分まで、ただしクエリ部分を含まない)以降のすべての文字に一致し?ますが、そこに何かがある場合にのみ一致します。他@Path("/name/...")に何かがあると、物事が本当に混乱する可能性があることに注意してください!だからそうしないでください。

于 2012-06-21T08:38:40.197 に答える
6

tomcatを使用していて/、pathparamを渡したい場合。@Path("/name/{name:.+}")'Donal Fellows'が言ったようなものに加えて、jvm引数に追加する必要が-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=trueあります。tomcatsecurity -howtoも参照してください。

于 2013-07-15T08:49:47.030 に答える
0

エンコーディングタイプを指定してみてください。次のように動作します/name/test.%252Ftest

System.out.println(URLDecoder.decode(name, "UTF-8"));
return URLDecoder.decode(name, "UTF-8");
于 2012-06-21T08:26:29.483 に答える
0

Glassfish v4は、スラッシュ%2fのエンコードされたスケープを受け入れます。次に、エンコードされた文字列test。%2Ftestに合格し、URLDecoder.decode(name、 "UTF-8")を使用して結果test./testを取得できます。これは、特に1つのリクエストに多くのパラメータがある場合に優れたソリューションだと思います。パス@Path( "/ name / {name:。+}")を使用すると、リクエストにパラメーターがほとんどない場合に最適なソリューションになります。

%252fを使用すると、エンコーディング要求文字列を手動で作成する必要があるため、クライアント要求が複雑になります。glassfish v4を使用すると、クライアントでURLEncoder.encodeを使用し、サーバーでURLDecoder.decodeを使用して、パーセントエンコードを簡単に使用できます。ほとんどのプログラミング言語にはパーセントエンコードとデコードがあるため、これは完璧なソリューションです。

Glassfish v3でエンコードされたスラッシュを有効にしようとしましたが、成功しませんでした。使用した構文は次のとおりです。

bin \ asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.encoded-slash-enabled = true configs.config.server-config.network-config.protocols.protocol .http-listener-1.http.encoded-slash-enabled = true

コマンドセットが正常に実行されました。

よろしくカシオセフリン

于 2014-03-04T14:57:20.377 に答える