JSF2读取GET参数中的特殊字符

时间:2012-11-08 01:33:21

标签: jsf-2 facelets

这是我的问题,有人可以帮助我....!

目前,我正在将应用程序从struts迁移到JSF2。 我们有一个用户验证链接,发送到他们的电子邮件进行验证, 成功注册后。 例如:

http://testserv:5050/bjb/page/validateAccount.faces?Email=qwerty@testsession#1.com&Code=1272

电子邮件地址包含发送给用户的旧链接中的特殊字符。 在新的应用程序中,我们使用URLEncoder.encode对它们进行编码。 我认为,这与UTF-8无关,但是 我将请求,响应和JSF ExternalContext #setResponseCharacterEncoding设置为UTF-8。 tomcat也配置为UTF-8。

validateAccount.xhtml

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
</h:head>
<h:body>
<h:form acceptcharset="UTF-8" name="verifyUserAccountForm" id="verifyUserAccountForm" prependId="false">
        <f:metadata>
            <f:event type="preRenderView" listener="#{verifyUserBean.execute}"></f:event>
        </f:metadata>
    </h:form>
</h:body>
</html>

在java代码中, 。FacesContext.getCurrentInstance()getExternalContext()getRequestParameterMap()得到(PARAMNAME)。 无法正确读取URL GET请求参数。

我应该如何为现有链接解决此问题。 我有一些想法,我可以在我的xhtml页面写一个javascript函数, 这可以在加载时执行,所以使用javascript函数我可以编码参数。 但是如何在<f:event type="preRenderView">调用之前执行该javascript函数。

有没有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

传出URL中的查询字符串参数应按如下方式编码,其中明确提到了所需的字符集:

String emailParam = URLEncoder.encode(email, "UTF-8");
String url = "http://testserv:5050/bjb/page/validateAccount.faces?Email=" + emailParam + "&Code=1272";

应该使用完全相同的字符集来解密Tomcat服务器以解码传入的URL:

<Context ... URIEncoding="UTF-8">

关于编码/解码GET URL,您需要做的就是这些。 HTML元标记与此无关。 HTTP响应编码与此无关。 HTML表单接受字符集的效果要差于好处。

请注意,您编辑了右侧Tomcat配置文件中的<Context>元素。如果你是在Eclipse中管理Tomcat,你默认需要编辑Eclipse的 Servers 项目中的那个,而不是Tomcat的安装文件夹。

另见