web-dev-qa-db-ja.com

JSTLでURLパスを表す文字列をエンコードする方法は?

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} になり得る?

32
Josh Johnson

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

要件を満たすには、 URLEncoder#encode() に委任して結果準拠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関数を宣言および登録する基本的なキックオフの例を見つけることができます。

53
BalusC

これが代替ソリューションであることは既にご存知でしょうが、特定の用途で最もエレガントなソリューションはリクエスト属性を使用することでした。

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

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

そして私のJSPで:

"...${myUrl}"
5
J. Dimeo

encodeUrlタグを持つjakarta String TagLibを使用できます。 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)"/>
1
shivaganesh

この方法でシンプルにしてください:

<%= Java.net.URLEncoder.encode(request.getAttribute("user.name").toString() , "UTF-8") %>
1
Daniel De León

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

これは役に立つかもしれません:

JSTLを使用してURLパスを表す文字列をエンコードする方法

0
AlexN