2011-02-19 4 views
32

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

<c:url value="/user/${user.name}"/> 

Согласно any documentation I find, это должно позаботиться об этом. Но это не так. Он красиво кодирует параметры (<c:url value="/user/${user.name}"><c:param name="section" value="employment 4u so good"/></c:url>), но я не передаю никаких параметров. Как я могу безопасно кодировать простой URL-адрес, например, выше, не опасаясь того, что может быть ${user.name}?

ответ

51

<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-й части this answer вы можете найти базовый пример стартового как объявить и зарегистрировать пользовательские функции EL.

+1

Спасибо, Balus C. Это то, что я сейчас делаю. Я надеялся, что что-то построено, но если это лучший способ, пусть так и будет. –

+16

Любопытно, что URLEncoder.encode() на самом деле не является правильным способом кодирования URL-адреса. Это правильный способ кодирования параметра URL *. Он изменяет пробелы на +, например. Правильной методикой является новый URI (null, url, null) .toASCIIString(), который, например, изменяет пробелы на% 20. – EJP

+1

Вопрос в вашей последней ссылке, кажется, был удален и доступен только пользователям 10k +. –

5

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

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

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

и в моем JSP:

"...${myUrl}" 
+0

Это неверно. См. Комментарий [Комментарий EJP] (http://stackoverflow.com/questions/5053975/how-to-url-encode-a-string-with-jstl#comment8244110_5064758). –

1

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

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

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

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

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

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

На верхней части всех страниц Jabarta taglib есть большая красная предупреждающая надпись, в которой говорится: «2010-04-14 - Джакарта Тэглибс был уволен». * Это не только для украшения. Вы больше не должны его использовать. – BalusC

0

Keep это просто так:

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

Ну, это нелегко, не просто. –

+0

Для меня скопируйте пасту в том месте, в котором я нуждаюсь, просто. Легко было бы использовать меньше персонажей. –

+0

Это неверно. См. Комментарий [Комментарий EJP] (http://stackoverflow.com/questions/5053975/how-to-url-encode-a-string-with-jstl#comment8244110_5064758). –

Смежные вопросы