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 文章也没有说明。我认为您将它与“URL 重写”(本质上只不过是在jsessionid必要时附加)混淆了。当<c:url>cookie 被禁用时,确实会这样做。

为了满足您对路径参数进行 URI 编码的要求,最好创建一个自定义 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", "~");
}

这个答案的第二部分,您可以找到一个基本的启动示例,如何声明和注册自定义 EL 函数。

于 2011-02-21T10:22:49.470 回答
5

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

所以在我的servlet中:

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

在我的 JSP 中:

"...${myUrl}"
于 2011-07-01T15:05:44.893 回答
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 应用程序部署描述符添加一个元素,如上述链接中所述

要在您的 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 回答