Как закодировать строку, представляющую 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}
может быть?
Ответы
Ответ 1
<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.
Ответ 2
Я уверен, что вы уже знали, что это альтернативное решение, но я решил, что для моего конкретного использования самым элегантным решением было использование атрибута запроса.
Итак, в моем сервлете:
req.setAttribute("myUrl", URLEncoder.encode(myUrl, "UTF-8"));
и в моем JSP:
"...${myUrl}"
Ответ 3
вы можете использовать джагарта String TagLib, которая
имеет тег encodeUrl:
http://jakarta.apache.org/taglibs/doc/string-doc/string-1.1.0/index.html#encodeUrl
Выполните следующие шаги, чтобы настроить веб-приложение с помощью этой библиотеки тегов:
- Скопируйте файл дескриптора библиотеки тегов в подкаталог /WEB -INF вашего веб-приложения.
- Скопируйте файл JAR библиотеки тегов в подкаталог /WEB -INF/lib вашего веб-приложения.
- Добавьте элемент в дескриптор развертывания вашего веб-приложения в /WEB -INF/web.xml, как сказано в приведенной выше ссылке.
Чтобы использовать теги из этой библиотеки на ваших страницах JSP, добавьте следующую директиву вверху каждой страницы:
Ниже приведен пример использования в jsp:
<a href="str:decodeUrl>${URL}</str:decodeUrl)"/>
Ответ 4
Держите его простым:
<%= java.net.URLEncoder.encode(request.getAttribute("user.name").toString() , "UTF-8") %>
Ответ 5
Правильный метод - new URI(null, url, null).toASCIIString()
, который, например, изменяет пробелы на %20
Это может быть полезно:
Как кодировать строку, представляющую URL-путь, с помощью JSTL?