JSF中的GET参数的UTF-8编码

oys*_*yse 10 java redirect utf-8 character-encoding jsf-2

我在JSF中有一个搜索表单,它使用RichFaces 4自动完成组件和以下JSF 2页面和Java bean实现.我使用Tomcat 6和7来运行应用程序.

...
<h:commandButton value="#{msg.search}" styleClass="search-btn" action="#{autoCompletBean.doSearch}" />
...
Run Code Online (Sandbox Code Playgroud)

在AutoCompleteBean中

public String doSearch() {

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

}
Run Code Online (Sandbox Code Playgroud)

只要具有"searchQuery"字符串的所有内容都在Latin-1中,这种方法就可以正常工作,如果不在Latin-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. 我在做一些奇怪的事吗?这似乎是应该支持开箱即用的东西,但我找不到任何其他有同样问题的东西.

Bal*_*usC 9

我认为你已经遇到了JSF中的一个案例错误.查询字符串是URL编码的,ExternalContext#encodeRedirectURL()其使用由获得的响应字符编码ExternalContext#getResponseCharacterEncoding().然而,虽然JSF默认使用UTF-8作为响应的字符编码,这只是被设置如果视图实际上是要被渲染,而不是当该响应是被重定向的,所以响应的字符编码仍返回平台默认ISO-8859-1其导致您的角色使用此错误编码进行URL编码.

我已将此报告为问题2440.同时,最好的办法是事先明确设置自己的响应字符编码.

FacesContext.getCurrentInstance().getExternalContext().setResponseCharacterEncoding("UTF-8");
Run Code Online (Sandbox Code Playgroud)

请注意,这仍然要求容器本身使用相同的字符编码来解码请求URL,因此您当然需要URIEncoding="UTF-8"在Tomcat的配置中进行设置.这不会弄乱角色,因为它们现在真的是UTF-8.