JBOSS EAP 德语变音编码损坏

Posted

技术标签:

【中文标题】JBOSS EAP 德语变音编码损坏【英文标题】:JBOSS EAP German Umlaut Encoding broken 【发布时间】:2017-10-16 13:43:40 【问题描述】:

我正在使用 JSF 2.1 和 primefaces 5.3.8 开发 JBoss EAP 6.4.4.GA (AS 7.5.4.Final-redhat-4)。

自从我的应用程序的最新版本部署以来,我的表单中的变音符号编码出现了问题。

在 inputText 字段中输入德语变音符号:

提交表单后:

        <p:inputText widgetVar="vornameVar" id="vornameInput"   value="#empfaengerBean.vorname">
        </p:inputText>

我的第一个想法是,新版本有错误。但不幸的是,我没有找到。此外,如果我恢复到旧版本(以前运行良好),也会突然发生错误。

我尝试按照JSF Form and German Umlauts 中的说明解决问题,但没有成功。

我添加了文件编码系统属性:

file.encoding = UTF-8
file.encoding.pkg = sun.io
sun.jnu.encoding = UTF-8
sun.io.unicode.encoding = UnicodeLittle

还有xhtml形式的字符集。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

我添加了一个 CharachterEncodingFilter:

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

不幸的是,它没有解决这个错误。

请求标头:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:no-cache
Connection:keep-alive
Content-Length:942
Content-Type:application/x-www-form-urlencoded
Cookie:JSESSIONID=FS0R99ApjnD0M667rZaNcwVT
Host:localhost:8080
Origin:http://localhost:8080
Pragma:no-cache
Referer:http://localhost:8080/faces/myform.xhtml?dswid=559
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36

响应标头: 内容类型:文本/html;字符集=UTF-8 日期:格林威治标准时间 2017 年 5 月 17 日星期三 07:37:17 服务器:Apache-Coyote/1.1 传输编码:分块 X-UA 兼容:IE=8; IE=边缘

表单数据:

layout:inhalt:empfaengerMask:vornameInput:ÖÄÖ
layout:inhalt:empfaengerMask:familiennameInput:öäö
layout:inhalt:empfaengerMask:geburtsdarumInput:
layout:inhalt:empfaengerMask:j_idt39_collapsed:false
layout:inhalt:empfaengerMask:saveAndBackButton:
javax.faces.ViewState:8922152724142018356:3520638725638532662
dspwid:559

回复:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<form id="layout:inhalt:empfaengerMask"
    name="layout:inhalt:empfaengerMask" method="post"
    action="/faces/myform.xhtml?dswid=559"
    enctype="application/x-www-form-urlencoded">
    <input type="hidden" name="layout:inhalt:empfaengerMask"
        value="layout:inhalt:empfaengerMask" />


    <table style="display: inline-block; float: left; text-align: left;">
        <tbody>
            <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <td><label id="layout:inhalt:empfaengerMask:j_idt67"
                    class="ui-outputlabel"
                    for="layout:inhalt:empfaengerMask:vornameInput">Vorname</label></td>
                <td><input id="layout:inhalt:empfaengerMask:vornameInput"
                    name="layout:inhalt:empfaengerMask:vornameInput" type="text"
                    value="ÃÃÃ" maxlength="80" /></td>
                <td><label id="layout:inhalt:empfaengerMask:j_idt70"
                    class="ui-outputlabel"
                    for="layout:inhalt:empfaengerMask:familiennameInput">Familienname</label></td>
                <td><input id="layout:inhalt:empfaengerMask:familiennameInput"
                    name="layout:inhalt:empfaengerMask:familiennameInput" type="text"
                    value="öäö" maxlength="80"
                    class="ui-inputfield ui-inputtext ui-widget ui-state-default ui-corner-all" /></td>
            </tr>
            <tr>
                <td><label id="layout:inhalt:empfaengerMask:j_idt73"
                    class="ui-outputlabel"
                    for="layout:inhalt:empfaengerMask:geburtsdarumInput">Geburtsdatum</label></td>
                <td><input id="layout:inhalt:empfaengerMask:geburtsdarumInput"
                    name="layout:inhalt:empfaengerMask:geburtsdarumInput" type="text"
                    class="ui-inputfield ui-inputmask ui-widget ui-state-default ui-corner-all" /></td>
                <td></td>
        </tbody>
    </table>

    </td>
    </tr>
    </table>
    </fieldset>
    </div>
    <input type="hidden"
        id="layout:inhalt:empfaengerMask:j_idt39_collapsed"
        name="layout:inhalt:empfaengerMask:j_idt39_collapsed" value="false" />
    </fieldset>
    <script id="layout:inhalt:empfaengerMask:j_idt39_s"
        type="text/javascript">PrimeFaces.cw("Fieldset","widget_layout_inhalt_empfaengerMask_j_idt39",id:"layout:inhalt:empfaengerMask:j_idt39",toggleable:true,collapsed:false,toggleSpeed:500);</script>

    <br />
    <p></p>
    <span id="layout:inhalt:empfaengerMask:detailPanel">

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </span></span>
    <p></p>
    <div id="layout:inhalt:empfaengerMask:aktionleiste"
        class="ui-widget-content layout_appaktionsleiste">
        <div class="layout_appaktionsleiste_content">
            <button id="layout:inhalt:empfaengerMask:j_idt120"
                name="layout:inhalt:empfaengerMask:j_idt120"
                class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
                onclick="PrimeFaces.addSubmitParam('layout:inhalt:empfaengerMask','disableValidation':'null')"
                style="float: left" type="submit">
                <span class="ui-button-text ui-c">Abbrechen</span>
            </button>
            <script id="layout:inhalt:empfaengerMask:j_idt120_s"
                type="text/javascript">PrimeFaces.cw("CommandButton","widget_layout_inhalt_empfaengerMask_j_idt120",id:"layout:inhalt:empfaengerMask:j_idt120");</script>
            <button id="layout:inhalt:empfaengerMask:saveAndBackButton"
                name="layout:inhalt:empfaengerMask:saveAndBackButton"
                class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
                onclick="" type="submit">
                <span class="ui-button-text ui-c">Speichern und zurück</span>
            </button>
            <script id="layout:inhalt:empfaengerMask:saveAndBackButton_s"
                type="text/javascript">PrimeFaces.cw("CommandButton","saveAndBackButtonVar",id:"layout:inhalt:empfaengerMask:saveAndBackButton");</script>
            <script id="layout:inhalt:empfaengerMask:j_idt122_s"
                type="text/javascript">$(function()PrimeFaces.cw("DefaultCommand","widget_layout_inhalt_empfaengerMask_j_idt122",id:"layout:inhalt:empfaengerMask:j_idt122",target:"layout:inhalt:empfaengerMask:saveAndBackButton"););</script>
        </div>
    </div>
    <div style="clear: both;"></div>
    <span id="layout:inhalt:empfaengerMask:wizInit"> <script
            type="text/javascript">
                    var arDialog = null;
                    mainInitWiz();
                </script></span><input type="hidden" name="javax.faces.ViewState"
        id="javax.faces.ViewState"
        value="8922152724142018356:-5232436045222872752" autocomplete="off" />
</form>
</html>

我不知道到目前为止我错过了什么。

【问题讨论】:

如果将p:inputText 替换为h:inputText 是否有效?...并且“如果我恢复到旧版本(以前运行良好),错误突然发生为好吧。” 还有什么变化? 更改为h:inputText 并没有解决问题。我刚刚查看了我的更改。与当前版本相比,后端 bean 中只有一些小的布局和错误修复。由于另一个问题 (***.com/questions/23375313/…),添加了以下系统属性:&lt;system-properties&gt; &lt;property name="org.apache.catalina.connector.RECYCLE_FACADES" value="true" &lt;/system-properties&gt; 【参考方案1】:

我刚刚找到了编码损坏的原因。 出于调试原因,我添加了一个 RequestDumperValve 来在我的 JBoss 配置中记录 HTTP 请求标头。

    <valve name="RequestLogging" module="org.jboss.as.web" class-name="org.apache.catalina.valves.RequestDumperValve"/>

但是,正如https://rolfje.wordpress.com/2008/07/20/tomcat-utf-8-and-the-requestdumpervalve/ 所述,RequestDumperValve 不仅会转储请求,还会扰乱对非 ISO-8859-1 传入参数的解析。

【讨论】:

以上是关于JBOSS EAP 德语变音编码损坏的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 Android 中检测德国元音变音

内容URL编码类型损坏?

从Jboss EAP 6.4迁移到EAP 7.1

从 JBoss 7 EAP 中排除提供的 jackson 版本

获取损坏的 Base64 编码图像

Jboss 4.2.3 迁移到 Jboss 7 EAP、数据源和安全性