2012-06-12 2 views
10

RichFaces 4 자동 완성 구성 요소와 다음 JSF 2 페이지 및 Java bean을 사용하여 구현 된 JSF 검색 양식이 있습니다. Tomcat 6 & 7을 사용하여 응용 프로그램을 실행합니다. AutoCompleteBeanJSF에서 GET 매개 변수의 UTF-8 인코딩

public String doSearch() { 

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

} 

에서

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

이은 "SEARCHQUERY"문자열 라틴-1에 withing에 모든 것을만큼 잘 작동, 그것은 외부 라틴어-1의 경우 작동하지 않습니다.

예를 들어 "bodø"에 대한 검색은 자동으로 "bod % F8"으로 인코딩됩니다. 그러나 "Kra Ðong"에 대한 검색은 "Ð"를 인코딩 할 수 없으므로 작동하지 않습니다.

저는이 문제를 해결하기 위해 여러 가지 방법을 시도했지만 그 중 아무 것도 작동하지 않습니다.

  • URLEncode를 사용하여 searchQuery 인코딩을 시도했지만, %는 (는) % 25 (으)로 인코딩되어 있기 때문에 이중 인코딩으로 이어집니다.
  • java.net.URI를 사용하여 인코딩을 시도했지만 URLEncode와 동일한 결과를 제공합니다.
  • URIEncoding = "UTF-8"을 사용하여 Tomcat에서 UTF-8을 사용하려고했지만이 문제는 비 ASCII 문자가 전혀 작동하지 않기 때문에 문제를 악화시킵니다. 그래서 내 질문에

는 :

  1. 나는 방식 JSF 2는 GET 매개 변수를 인코딩 변경할 수 있습니까?
  2. JSF 2에서 GET 매개 변수를 인코딩하는 방식을 변경할 수없는 경우 수동으로 인코딩을 변경하고 수동으로 할 수 있습니까?
  3. 나는 이상한 곳에서 뭔가를하고 있니? 이것은 out-of-the-box에서 지원되어야하는 것으로 보이지만 동일한 문제를 가진 다른 것들은 찾을 수 없습니다.

답변

9

JSF의 구석에있는 버그를 발견했다고 생각합니다. 쿼리 문자열은 으로 얻은 응답 문자 인코딩을 사용하는 ExternalContext#encodeRedirectURL()으로 URL 인코딩됩니다. 그러나 JSF는 기본적으로 응답 문자 인코딩으로 UTF-8을 사용하지만 응답이 리디렉션 될 때가 아니라 실제로 뷰를 렌더링 할 경우에만 설정됩니다. 따라서 응답 문자 인코딩은 여전히 ​​플랫폼 기본값 인 ISO-8859-1을 반환합니다. 이 문자는 잘못된 인코딩을 사용하여 URL 인코딩됩니다.

나는 이것을 issue 2440으로보고했습니다. 그 사이에 가장 좋은 방법은 명시 적으로 응답 문자 인코딩을 미리 설정하는 것입니다.이 여전히 용기 자체가 요청 URL을 디코딩 같은 문자 인코딩을 사용하기 때문에 당신은 확실히 Tomcat의 구성에 URIEncoding="UTF-8"을 설정해야한다는 것을 요구하는

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

참고. 이제 문자가 UTF-8이 될 것이므로 문자를 더 이상 엉망으로 만들지 않습니다.

+0

예, 작동합니다. 감사! – oyse

+0

당신은 환영합니다 :) – BalusC

0

HTTP URL 및 헤더에 허용되는 문자 인코딩은 US-ASCII뿐이므로이 문자를 URL 인코딩하여 응용 프로그램에 다시 보내야합니다. 가장 간단한 방법은 다음과 같습니다.

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"; 

} 

그리고 나서 사용하는 모든 문자에 사용할 수 있습니다.

+0

JSF는이를 암시 적으로 수행합니다. 적어도, 그렇게해야합니다. 질문을 다시 한 번 읽으십시오. 예 : * "URLEncode를 사용하여 searchQuery 자체 인코딩을 시도했지만 %는 % 25 (으)로 인코딩되었으므로 이중 인코딩으로 연결됩니다."* – BalusC