Избегайте кодировки URL
У меня возникла проблема, связанная с кодировкой URL в моем приложении Struts 2. Я провел некоторое исследование, но не смог найти правильный способ сделать это.
Мое приложение подготавливает URL-адрес динамически и получает переменную, запрашивая базу данных. Действительный URL, который я ожидаю
http://www.test.com/language=english&numbers=X,Y,Z
Тем не менее, когда пользовательский интерфейс из-за кодировки URL, я получаю URL, как показано ниже
http://www.test.com/language=english&numbers=X%2CY%2CZ
числа являются единственной переменной, и база данных возвращает значение как X,Y,Z.
Я готовлю URL в JSP, как показано ниже
<s:url id="testUrl" escapeAmp="false" value="http://www.test.com">
<s:param name="language" value="%{'english'}" />
<s:param name="numbers" value="%{Num}" />
</s:url>
Я попытался кодировать = "ложь" в теге s:url, но безрезультатно.
TestUrl является гиперссылкой, как показано ниже
<a href="<s:property value="#testUrl" />" target="_blank">
<s:property value="#Num" />
</a>
Я понимаю, что запятая (,) является зарезервированным символом и должна быть закодирована. Тем не менее, в моем URL мне нужна эта запятая, чтобы успешно выполнить URL при нажатии. Я использую набор символов iso-8859-1.
2 ответа
Это может быть не лучшим подходом для всех, но я смог заставить это работать, используя JavaScript. Я тщательно протестировал функциональность, и в настоящее время она служит моей цели.
У меня не было возможности изменить URL-адрес, поскольку это был сторонний URL-адрес.
Поэтому, когда пользователь нажимает гиперссылку на моем сайте, вызывается java-скрипт. URL расшифровывается и открывается в новом окне.
<a href="#" onclick="decodeURL('<s:property value="#testUrl"/>')">
<s:property value="#Num" />
</a>
Javascript
function decodeURL(url) {
var url_dec = decodeURIComponent(url);
window.open(url_dec);
}
Я понимаю, что запятая (,) является зарезервированным символом и должна быть закодирована. Тем не менее, в моем URL мне нужна эта запятая
Тогда вы не... это прекрасный пример проблемы XY:
Проблема XY спрашивает о вашей попытке решения, а не о вашей реальной проблеме.
То есть вы пытаетесь решить проблему X, и вы думаете, что решение Y будет работать, но вместо того, чтобы спрашивать о X, когда у вас возникают проблемы, вы спрашиваете о Y.
Что-то не так было исправлено в спецификациях проекта, и теперь ему нужно что-то еще более неправильное, чтобы обойти первую проблему.
Вы не должны использовать неэкранированные запятые в URL; Пройдите назад цепочку спецификаций, чтобы найти, где они могут быть разветвлены в более новом, более безопасном направлении.
Если требуется, например, иметь читаемые URL-адреса (обычно называемые " Красивые URL-адреса" или " RESTful URL-адреса"), вы можете использовать расширенные сопоставления с подстановочными знаками; скажем, у вас всегда есть три числа, как для декартовых координат; Вы могли бы сделать так:
<action name="/coordinates/{x}/{y}/{z}" class="foo.bar.CartesianAction">
вызывается с помощью URL:
http://www.test.com/coordinates/1/2/3
, более читабельным, чем ваш исходный URL. Но есть решения (не включающие запятые в URL) для всех ваших потребностей, это только пример.
Примечание:
Из URL-адреса, который вы разместили (возможно, совершенно не связанного с вашим реальным вариантом использования), вы, вероятно, подключили свое веб-приложение к корневому контексту и что вы - Действие, состоящее только из переменных (без имени действия); если это так, вы можете прочитать этот ответ.
language=english
часть также, вероятно, полностью подделана, но в отдаленном случае вы действительно работаете с языком самостоятельно, знайте, что фреймворк будет рад помочь вам в этом.