Как кодировать строку, представляющую URL-путь, с помощью JSTL?

Каков наилучший способ 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 ответа

Решение

<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", "~");
}

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

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

Итак, в моем сервлете:

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

и в моем JSP:

"...${myUrl}"

Сохраняйте это простым таким образом:

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

Вы можете использовать строковый тег TagLib из Джакарты, который имеет тег encodeUrl: http://jakarta.apache.org/taglibs/doc/string-doc/string-1.1.0/index.html

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

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

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

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

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

Правильная техника new URI(null, url, null).toASCIIString(), который, например, заменяет пробелы на %20

Это может быть полезно:

Как закодировать строку, представляющую URL-путь, с помощью JSTL?

Другие вопросы по тегам