在JSF GET参数UTF-8编码(UTF-8 encoding of GET parameters

2019-09-18 01:02发布

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

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

在AutoCompleteBean

public String doSearch() {

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

}

这只要作品以及一切withing的“SEARCHQUERY”字符串是拉美-1,它不一样,如果是Latin-1的外面工作。

例如,对于“博德”的搜索将自动编码为“BOD%F8”。 然而,对于“克拉咚”的搜索将无法正常工作,因为它是无法编码“d”。

现在我已经尝试了几种不同的方法来解决这个问题,但他们没有工作。

  • 我曾尝试编码SEARCHQUERY使用URLEncode的我自己,但既然%被编码为%25这仅导致双编码。
  • 我一直在使用java.net.URI中得到的编码试过,但给出了相同的结果URLEncode的。
  • 我试图在连接器使用的URIEncoding =“UTF-8”在Tomcat中打开UTF-8但此后非ASCII字符不会在所有的工作这只是加剧了这一问题。

所以,我的问题:

  1. 我可以改变JSF 2的方式编码的GET参数?
  2. 如果我不能改变JSF 2编码的GET参数的方式,我可以把编码的和做手工?
  3. 我是不是哪里奇怪吗? 这似乎喜欢的事,应予以支持外的开箱,但我不能找到同样的问题任何人。

Answer 1:

我想你已经打在JSF一个角落的情况下错误。 查询字符串由URL编码ExternalContext#encodeRedirectURL()它使用该响应的字符编码由所获得ExternalContext#getResponseCharacterEncoding() 然而,虽然JSF默认使用UTF-8作为响应的字符编码,这只是设置如果视图实际上是被渲染,而不是当响应是重定向,所以响应的字符编码仍返回平台默认的ISO-8859-1这会导致你的角色是URL编码使用这种错误的编码。

我报这是问题2440 。 在此期间你最好的赌注是明确设置编码事先自行响应特性。

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

请注意,这仍需要容器本身使用相同的字符编码解码请求的URL,那么你一定需要设置URIEncoding="UTF-8"在Tomcat的配置。 这不会弄乱人物了,因为他们将是真正的UTF-8了。



Answer 2:

接受HTTP URL和头唯一的字符编码为US-ASCII,你需要URL编码这些字符送他们返回给应用程序。 要做到这一点在Java中是最简单的方法:

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

}

然后,它应该工作为你使用任何字符。



文章来源: UTF-8 encoding of GET parameters in JSF