Как кодировать строку, представляющую URL-путь, с помощью JSTL? - PullRequest
32 голосов
/ 20 февраля 2011

Каков наилучший способ URL-кодирования строки, представляющей URL-путь (не параметр запроса) с JSTL?

<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 ]

53 голосов
/ 21 февраля 2011

<c:url> не кодирует URI, как указано в его значении, а только параметры запроса URL, которые указываются вложенным <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", "~");
}

Во 2-й части этот ответ вы можете найтиосновной базовый пример того, как объявлять и регистрировать пользовательские функции EL.

5 голосов
/ 01 июля 2011

Я уверен, что вы уже знали, что это альтернативное решение, но я решил, что для моего конкретного использования наиболее элегантным решением было использование атрибута запроса.

Так в моем сервлете:

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

и в моем JSP:

"...${myUrl}"
1 голос
/ 20 июня 2014

Проще говоря:

<%= java.net.URLEncoder.encode(request.getAttribute("user.name").toString() , "UTF-8") %>
1 голос
/ 14 сентября 2012

вы можете использовать jakarta String TagLib с тегом encodeUrl: http://jakarta.apache.org/taglibs/doc/string-doc/string-1.1.0/index.html#encodeUrl

Выполните следующие шаги для настройки вашего веб-приложения с этой библиотекой тегов:

  1. СкопируйтеФайл дескриптора библиотеки тегов в подкаталоге / WEB-INF вашего веб-приложения.
  2. Скопируйте файл JAR библиотеки тегов в подкаталог / WEB-INF / lib вашего веб-приложения.
  3. Добавьтеэлемент к дескриптору развертывания вашего веб-приложения в /WEB-INF/web.xml, как сказано в приведенной выше ссылке

Чтобы использовать теги из этой библиотеки на страницах JSP, добавьте следующую директиву вверхукаждой страницы:

ниже приведен пример использования в jsp:

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