Строка запроса декодируется Spring Framework

У меня странная проблема, хотя не уверен, что это ошибка. Проект работает под Spring Framework.

Вид:

<form method="GET" action="someUrl.htm" enctype="application/x-www-form-urlencoded" >

    <label>Label</label>
    <input name="val1" value="${val1}" />
  ... 
      <!-- submit button here -->
</form>

Контроллер сопоставляется с someUrl.htm с помощью SimpleUrlHandlerMapping

<bean id="parameterMethodNameResolver"
        class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">    <property name="methodParamNames">
            ...
</bean>

<bean id="handlerMapping"
        class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">    
        <property name="urlDecode" value="false" />
        <property name="mappings">
            <props>
                <prop key="**/someUrl.htm">someController</prop>
            </props>
        </property>
</bean>

Я хочу передать % как val1. Но когда я это делаю, следующий фрагмент кода возвращает null:

request.getParameter("val1");

catalina.out показывает:

ВНИМАНИЕ: Параметры: Ошибка декодирования символов. Параметр «val1» со значением «%» был проигнорирован.

Я узнаю, что Spring декодирует строку запроса, и request.getQueryString() возвращает val1=%, но не val1=%25.

Как предотвратить UrlDecoding здесь?

Это ошибка? Обратите внимание, что для параметра urlDecode установлено значение false.

Любые идеи по решению проблемы, потому что мне действительно нужно использовать такие символы, как %&=.


person Sqeezer    schedule 30.01.2012    source источник
comment
Какую версию Spring вы используете?   -  person ustun    schedule 30.01.2012
comment
Вы не можете кодировать символы? ietf.org/rfc/rfc2396.txt определяет % как начало экранированной последовательности, а не подчинение этому, вероятно, вызовет у вас проблемы.   -  person Roger Lindsjö    schedule 30.01.2012
comment
rfc2396 указывает, что «%» должен быть экранирован как «% 25». 'application/x-www-form-urlencoded' делает это бесплатно. Проблема здесь в том, что Spring декодирует строку запроса, а затем, когда я пытаюсь вызвать getParameter, параметр запроса декодируется во второй раз. Итак, чтобы предотвратить это, мы должны каким-то образом указать Spring не декодировать строку запроса.   -  person Sqeezer    schedule 30.01.2012
comment
Почему вы делаете GET из формы вместо POST?   -  person GriffeyDog    schedule 31.01.2012
comment
%, ? и & — недопустимые символы для использования в URL-адресе, и их необходимо экранировать.   -  person bmoran    schedule 31.01.2012
comment
Неважно, использую ли я GET или POST. Я вижу, что браузер отправляет var1=%25&var2=etc. Но на стороне контроллера строка запроса выглядит как var1=%&var2=etc. JavaDoc говорит, что getQueryString возвращает недекодированную строку. Затем декодирование происходит в самой Spring. Я думал 'urlDecode' отвечает, декодировать или нет, но это никак не влияет. Я не использую %?& в URL-адресе, я просто хочу передать их, 'application/x-www-form-urlencoded' обрабатывает там кодировку URL.   -  person Sqeezer    schedule 31.01.2012
comment
Если вы считаете, что это ошибка, то как минимум обновитесь до последней версии Spring 2.0.x (т.е. 2.0.8). Но вам действительно следует перейти на что-то более новое, 2.0 действительно очень старый.   -  person skaffman    schedule 31.01.2012


Ответы (2)


Что вам нужно сделать, так это не использовать карту параметров Spring. Создайте фильтр, который будет читать строку запроса в ее необработанном формате, декодировать ее самостоятельно, получать нужные значения и добавлять их в bean-компонент, который можно будет прочитать позже, когда вам это нужно. Я не совсем понимаю, как сделать последнюю часть, потому что Spring 2.0.5 устарел, и все, что я вам скажу, может не работать в этой версии. Объект, который находится в области сеанса, должен быть в порядке.

person Community    schedule 25.02.2012

У меня возникает та же проблема. Однако я могу найти правильную кодировку в request.getQueryString().

person Ojitha    schedule 02.07.2015