如何使用JSTL对表示URL路径的String进行编码?

时间:2011-02-19 22:32:34

标签: jsp jstl el uriencoding

使用JSTL对表示URL路径(而不是请求参数)的String进行URL编码的最佳方法是什么?

<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}可能是什么?

5 个答案:

答案 0 :(得分:52)

<c:url>不对其值中指定的URI进行编码,而只编码由嵌套<c:param>指定的URL请求参数。您链接的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的第2部分,您可以找到如何声明和注册自定义EL函数的基本启动示例。

答案 1 :(得分:5)

我相信你已经知道这是一个替代解决方案,但我决定使用我最特别的解决方案是使用请求属性。

所以在我的servlet中:

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

在我的JSP中:

"...${myUrl}"

答案 2 :(得分:1)

你可以使用jakarta String TagLib 有一个encodeUrl标签: 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应用程序部署描述符添加一个元素,如上面链接中所述
  4. 要在JSP页面中使用此库中的标记,请在每个页面的顶部添加以下指令:

    下面的

    是jsp中的用法示例:

    <a href="str:decodeUrl>${URL}</str:decodeUrl)"/>
    

答案 3 :(得分:1)

以这种方式保持简单:

<%= java.net.URLEncoder.encode(request.getAttribute("user.name").toString() , "UTF-8") %>

答案 4 :(得分:0)

正确的技术是new URI(null, url, null).toASCIIString(),例如,将空格更改为%20

这可能会有所帮助:

How to encode a String representing URL path with JSTL?