Как кодировать строку, представляющую 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
Выполните следующие шаги для настройки вашего веб-приложения с этой библиотекой тегов:
- Скопируйте файл дескриптора библиотеки тегов в подкаталог /WEB-INF вашего веб-приложения.
- Скопируйте файл JAR библиотеки тегов в подкаталог /WEB-INF/lib вашего веб-приложения.
- Добавьте элемент в дескриптор развертывания веб-приложения в /WEB-INF/web.xml, как указано в приведенной выше ссылке
Чтобы использовать теги из этой библиотеки на своих страницах JSP, добавьте следующую директиву вверху каждой страницы:
ниже приведен пример использования в jsp:
<a href="str:decodeUrl>${URL}</str:decodeUrl)"/>
Правильная техника new URI(null, url, null).toASCIIString()
, который, например, заменяет пробелы на %20
Это может быть полезно:
Как закодировать строку, представляющую URL-путь, с помощью JSTL?