访问 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 2:如何将包含要调用的参数的动作传递给 Facelets 子视图(使用 ui:include 和 ui:param)?