32

JSTLでURLパス(リクエストパラメータではない)を表す文字列をURLエンコードするための最良の方法は何ですか?

<c:url value="/user/${user.name}"/>

私が見つけたドキュメントによると、これはそれを処理する必要があります。しかし、そうではありません。パラメータを美しくエンコードしますが(<c:url value="/user/${user.name}"><c:param name="section" value="employment 4u so good"/></c:url>)、パラメータを渡していません。上記のような単純なURLを、何ができるかを恐れずに安全にエンコードするにはどう${user.name}すればよいですか?

4

5 に答える 5

54

は、その<c:url>値で指定されたURIをエンコードしませんが、ネストされたで指定されたURL要求パラメーターのみをエンコードします<c:param>。あなたがリンクしたIBMの記事もそうではありません。jsessionid「URL書き換え」(本質的には必要に応じて追加するだけ)と混同されたと思います。確かに、<c:url>Cookieが無効になっている場合も同様です。

URLEncoder#encode()パスパラメータをURIエンコードするという要件を達成するには、結果の適合URIルールに委任して変更するカスタムEL関数を作成するのが最善です。

<a href="/user/${util:encodeURI(user.name)}">view profile</a>

public static String encodeURI(String value) throws UnsupportedEncodingException {
    return URLEncoder.encode(value, "UTF-8")
        .replace("+", "%20")
        .replace("%21", "!")
        .replace("%27", "'")
        .replace("%28", "(")
        .replace("%29", ")")
        .replace("%7E", "~");
}

この回答の2番目の部分では、カスタムEL関数を宣言および登録する方法の基本的なキックオフの例を見つけることができます。

于 2011-02-21T10:22:49.470 に答える
5

これが代替ソリューションであることはすでにご存知だと思いますが、私の特定の用途では、最も洗練されたソリューションはリクエスト属性を使用することであると判断しました。

だから私のサーブレットでは:

req.setAttribute("myUrl", URLEncoder.encode(myUrl, "UTF-8"));

そして私のJSPでは:

"...${myUrl}"
于 2011-07-01T15:05:44.893 に答える
1

encodeUrlタグを持つjakartaStringTagLibを使用できます:http: //jakarta.apache.org/taglibs/doc/string-doc/string-1.1.0/index.html#encodeUrl

次の手順に従って、このタグライブラリを使用してWebアプリケーションを構成します。

  1. タグライブラリ記述子ファイルをWebアプリケーションの/WEB-INFサブディレクトリにコピーします。
  2. タグライブラリのJARファイルをWebアプリケーションの/WEB-INF/libサブディレクトリにコピーします。
  3. 上記のリンクに記載されているように、/ WEB-INF/web.xmlのWebアプリケーションデプロイメント記述子に要素を追加します

このライブラリのタグをJSPページで使用するには、各ページの上部に次のディレクティブを追加します。

以下は、jspでの使用例です。

<a href="str:decodeUrl>${URL}</str:decodeUrl)"/>
于 2012-09-14T19:33:25.047 に答える
1

このようにシンプルに保ちます。

<%= java.net.URLEncoder.encode(request.getAttribute("user.name").toString() , "UTF-8") %>
于 2014-06-20T16:31:16.170 に答える
0

正しいテクニックはですnew URI(null, url, null).toASCIIString()。たとえば、スペースを次のように変更します。%20

これは役立つ可能性があります:

JSTLでURLパスを表す文字列をエンコードするにはどうすればよいですか?

于 2019-07-22T13:54:51.663 に答える