Избегайте кодировки 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 часть также, вероятно, полностью подделана, но в отдаленном случае вы действительно работаете с языком самостоятельно, знайте, что фреймворк будет рад помочь вам в этом.

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