2012-01-30 12 views
8

Mam tutaj dziwny problem, ale nie jestem pewien, czy to błąd. Projekt działa pod Spring Framework.Ciąg zapytania jest dekodowany przez Spring Framework

Widok:

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

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

Controller mappend do someUrl.htm użyciu 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> 

Chcę przekazać % jak val1. Ale kiedy to robię, następujący fragment kodu zwraca null:

request.getParameter("val1"); 

catalina.out pokazuje:

Ostrzeżenie: Parametry: Charakter dekodowanie nie powiodło się. Parametr "val1" o wartości "%" został zignorowany.

dowiem się, że wiosna dekoduje ciąg kwerendy i request.getQueryString() powraca val1=% lecz nie val1=%25.

Jak zapobiec wprowadzeniu UrlDecoding tutaj?

Czy to błąd? Proszę zauważyć, że parametr urlDecode jest ustawiony na false.

Wszelkie pomysły na obejście problemu, ponieważ naprawdę potrzebuję używać znaków takich jak %&=.

+0

Którą wersję Spring używasz? – ustun

+0

Wersja sprężynowa to 2.0.5. – Sqeezer

+0

Nie można zakodować znaków? http://www.ietf.org/rfc/rfc2396.txt definiuje% jako sekwencję startową z sekwencją ucieczki, nieprzestrzeganie tego prawdopodobnie spowoduje problemy. –

Odpowiedz

1

Co musisz zrobić, to nie używać mapy parametrów Spring. Utwórz filtr, który odczyta ciąg zapytania w jego surowym formacie, sam go dekoduje, pobiera potrzebne wartości i dodaje je do komponentu bean, który można odczytać później, gdy jest potrzebny. Nie mam pojęcia, jak to zrobić, ponieważ Spring 2.0.5 jest stary i wszystko, co powiem, może nie działać w tej wersji. Obiekt znajdujący się w zakresie sesji powinien być w porządku.

0

Mam ten sam problem. Jednak mogę znaleźć odpowiednie kodowanie w request.getQueryString().

Powiązane problemy