访问 JSF / facelets 中的请求参数的过滤器导致错误编码

Posted

技术标签:

【中文标题】访问 JSF / facelets 中的请求参数的过滤器导致错误编码【英文标题】:Filter with access to request parameter in JSF / facelets leads to wrong encoding 【发布时间】:2011-08-29 15:16:46 【问题描述】:

我面临以下问题/错误 (对于用例:我添加了一个 log4j 过滤器,因为它可以提供很好的日志记录,请参阅here for 详细信息)

这是关于在过滤器中访问请求参数时编码到底发生了什么: 所有 ü ä ö é è à 等都会变成 ü ä ö é è à 和他们丑陋的朋友。 如果我不访问请求参数,它可以正常工作。

这会导致整个应用程序中出现错误的字符

public class Log4jDiagnosticFilter implements Filter 

    public void init(FilterConfig arg0) throws ServletException 
    

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
            ServletException 
                String requestId=request.getParameter("LOGID");
                chain.doFilter(request, response);
        

不访问请求参数时所有字符都可以。

我有什么遗漏吗?有其他方法吗?

顺便说一句,我们使用的是 java 1.5 和 jsf 1.2

【问题讨论】:

【参考方案1】:

您显然有另一个过滤器,它可以处理request.setCharacterEncoding("UTF-8")。这是一项一次性任务,它要求尚未解析请求正文。但是调用getParameter() 将开始解析整个请求体。所以如果你把这个日志过滤器放在编码过滤器前面,那么应用程序的剩余部分检索正确编码的字符就太晚了。

交换web.xml 中的过滤器顺序,并确保将字符编码过滤器放在以任何方式访问请求正文的任何​​其他过滤器之前。

【讨论】:

以上是关于访问 JSF / facelets 中的请求参数的过滤器导致错误编码的主要内容,如果未能解决你的问题,请参考以下文章

jsf和facelets的生命周期

J2EE作业_JSF和facelets的生命周期

JSF 2:如何将包含要调用的参数的动作传递给 Facelets 子视图(使用 ui:include 和 ui:param)?

JSF Web框架与Facelets表现层技术

JSF Web框架与Facelets表现层技术

javaEE 之 JSF与Facelets