使用JSTL对表示URL路径(不是请求参数)的字符串进行URL编码的最佳方法是什么? c:url value="/user/${user.name}"/ 根据any documentation I find,这应该照顾它。但它不。它精美地编码参数( c:url val
<c:url value="/user/${user.name}"/>
根据any documentation I find,这应该照顾它。但它不。它精美地编码参数(< 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>指定的网址请求参数进行编码。您链接的IBM文章也没有另外说明。我认为你把它与“URL重写”(这本质上只是在必要时附加jsessionid)混淆。要实现您的要求,最好是创建一个自定义EL函数,该函数委托URLEncoder#encode()
并更改结果符合URI规则。
<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", "~"); }
在this answer的第二部分,你可以找到一个基本的启动示例如何声明和注册自定义EL函数。