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}
になり得る?
_<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関数を宣言および登録する基本的なキックオフの例を見つけることができます。
これが代替ソリューションであることは既にご存知でしょうが、特定の用途で最もエレガントなソリューションはリクエスト属性を使用することでした。
だから私のサーブレットでは:
req.setAttribute("myUrl", URLEncoder.encode(myUrl, "UTF-8"));
そして私のJSPで:
"...${myUrl}"
encodeUrlタグを持つjakarta String TagLibを使用できます。 http://jakarta.Apache.org/taglibs/doc/string-doc/string-1.1.0/index.html#encodeUrl
このタグライブラリを使用してWebアプリケーションを構成するには、次の手順に従います。
JSPページでこのライブラリのタグを使用するには、各ページの上部に次のディレクティブを追加します。
以下はjspでの使用例です。
<a href="str:decodeUrl>${URL}</str:decodeUrl)"/>
この方法でシンプルにしてください:
<%= Java.net.URLEncoder.encode(request.getAttribute("user.name").toString() , "UTF-8") %>
正しいテクニックはnew URI(null, url, null).toASCIIString()
です。たとえば、スペースを%20
に変更します
これは役に立つかもしれません: