2012-06-12 10 views
10

Mam formularz wyszukiwania w JSF, który jest zaimplementowany za pomocą składnika autouzupełniania RichFaces 4 i następującej strony JSF 2 i komponentu Java bean. Używam Tomcat 6 & 7, aby uruchomić aplikację.Kodowanie UTF-8 parametrów GET w JSF

... 
<h:commandButton value="#{msg.search}" styleClass="search-btn" action="#{autoCompletBean.doSearch}" /> 
... 

W AutoCompleteBean

public String doSearch() { 

    //some logic here 
    return "/path/to/page/with/multiple_results?query=" + searchQuery + "&amp;faces-redirect=true"; 

} 

Działa to dobrze, tak długo, jak wszystko się withing "SEARCHQUERY" łańcuch jest w Latin-1, to nie działa, jeśli jest poza Latin-1.

Na przykład wyszukiwanie słowa "bodø" zostanie automatycznie zakodowane jako "bod% F8". Jednak wyszukiwanie "Kra Ðong" nie będzie działać, ponieważ nie można zakodować "Ð".

Próbowałem teraz kilka różnych podejść, aby rozwiązać ten problem, ale żaden z nich nie działa.

  • Próbowałem kodującego SEARCHQUERY mój własny, używając urlencode, ale to tylko prowadzi do podwójnego kodowania od% jest zakodowany jako% 25.
  • Próbowałem użyć java.net.URI, aby uzyskać kodowanie, ale daje taki sam wynik jak URLEncode.
  • Próbowałem włączyć kodowanie UTF-8 w Tomcat za pomocą URIEncoding = "UTF-8" w łączniku, ale to tylko pogarsza ten problem, ponieważ wtedy znaki nie-ascii w ogóle nie działają.

Więc na moje pytania:

  1. mogę zmienić sposób JSF 2 koduje parametry GET?
  2. Jeśli nie mogę zmienić sposobu, w jaki JSF 2 koduje parametry GET, czy mogę włączyć kodowanie i zrobić to ręcznie?
  3. Czy robię coś, co tutaj jest dziwne? Wydaje się, że to coś, co powinno być obsługiwane natychmiast, ale nie mogę znaleźć żadnych innych osób z tym samym problemem.

Odpowiedz

9

Wydaje mi się, że trafiłeś w błąd w przypadku rogu w JSF. Łańcuch zapytania jest zakodowany przy użyciu adresu URL przez ExternalContext#encodeRedirectURL(), który wykorzystuje kodowanie znaków odpowiedzi uzyskane przez ExternalContext#getResponseCharacterEncoding(). Jednak, podczas gdy JSF domyślnie używa UTF-8 jako kodowania znaków odpowiedzi, jest to ustawione tylko wtedy, gdy widok ma być renderowany, a nie kiedy odpowiedź ma zostać przekierowana, więc kodowanie znaków odpowiedzi nadal zwraca wartość domyślną platformy ISO-8859-1 co powoduje, że twoje postacie są zakodowane za pomocą tego błędnego kodowania.

Zgłosiłem to jako issue 2440. W międzyczasie najlepiej jest najpierw ustawić kodowanie znaków odpowiedzi.

FacesContext.getCurrentInstance().getExternalContext().setResponseCharacterEncoding("UTF-8"); 

Zauważ, że to wymaga jeszcze, że sam pojemnik używa tego samego kodowania znaków zdekodować URL żądania, więc na pewno trzeba ustawić URIEncoding="UTF-8" w konfiguracji serwera Tomcat. To już nie zepsuje bohaterów, ponieważ teraz będą naprawdę UTF-8.

+0

Tak, to działa. Dzięki! – oyse

+0

Nie ma za co :) – BalusC

0

Jedynym kodowaniem znaków akceptowanym dla adresów URL HTTP i nagłówków jest US-ASCII, należy zakodować je za pomocą URL, aby wysłać je z powrotem do aplikacji. Najprostszym sposobem na to w java będzie:

public String doSearch() { 

    //some logic here 
    String encodedSearchQuery = java.net.URLEncoder.encode(searchQuery, "UTF-8"); 
    return "/path/to/page/with/multiple_results?query=" + encodedSearchQuery + "&amp;faces-redirect=true"; 

} 

A potem powinno działać dla każdej postaci, której używasz.

+0

JSF robi to niejawnie. Przynajmniej ma to zrobić. Przeczytaj pytanie jeszcze raz. Na przykład. * "Próbowałem zakodować kod wyszukiwania, używając kodu URLEncode, ale prowadzi to do podwójnego kodowania, ponieważ% jest zakodowany jako% 25." * – BalusC

Powiązane problemy