3

我在 eclipse juno 中有一个 webapp——当我在服务器上运行时运行良好——在 eclipse 的浏览器中(我在 Windows 上)或在 FF 中。

右键单击 >导出战争> 将其转储到 $CATALINA_HOME/webapps > 一切正常(解压好了)除了

  • 我的自定义标签 - 我有一个WEB-INF\functions.tld显然没有被读取的文件。server.xml自动生成的 Eclipse (在Servers项目中)和默认 Tomcat之间的唯一区别server.xml是以下行:

    <Context docBase="ted2012" path="/ted2012" 
    reloadable="true"source="org.eclipse.jst.jee.server:ted2012"/>
    

source是 WTP 特定的属性。
我设法解决了这个问题- 请参阅我的答案

  • Tomcat 无法正确获取 Url - 请参阅我的答案中的图片。

问题 :

  1. (未解决)为什么 Tomcat 不能正确解码 Url -而 eclipse 可以?失败在哪里?请参阅我的具体问题以获取有关调用堆栈的详细信息以及tomcat失败的确切位置
  2. 为什么tomcat首先没有看到tld而eclipse看到了?为什么我必须编辑web.xml?(在我的回答中解决了,应该是另一个问题)

代码在github中 - 在 INSTRUCTIONS.txt 文件中,有详细的说明来设置项目并重现我在下面的答案中描绘的错误。

Tomcat 7.0.32、日食 4.2、Java 1.7.9

4

2 回答 2

5

要正确解码 URI,您需要 Tomcat 中的 URIEncoding 连接器属性:

<connector ... URIEncoding="UTF-8" ... />

见我的咆哮https://stackoverflow.com/a/15587140/995876

所以它不附带普通代码,您需要在应用程序服务器配置中单独使用它或使用默认为 UTF-8 的应用程序服务器。不幸的是,没有办法从代码中影响这一点。

删除decodeRequestand never use new String/getByteswithout explicit encoding 参数。


选择。

如果您无法编辑服务器连接器配置,您可以通过明确提供编码来修复您的代码new String

public static String decodeRequest(String parameter) {
     return new String(parameter.getBytes("iso-8859-1"), "UTF-8");
}
于 2013-04-01T14:41:00.337 回答
1

有帮助的一件事是添加到web-xml

<jsp-config>
    <taglib>
        <taglib-uri>
            functions
        </taglib-uri>
        <taglib-location>
            functions.tld
        </taglib-location>
    </taglib>
</jsp-config>

现在 tomcat (7.0.30) 看到我的 taglib 用于编码 URI。


奇怪的事情:当我用系统打印用户名时,我得到了????在tomcat的控制台而不是象形文字中。也许这指向了问题?在我的控制器中,我有:

final String username = Helpers.decodeRequest(request
                .getParameter("user"));
System.out.println("ProfileController.doGet() user name DECODED : "
                                + username);

在哪里 :

private static final String CHARSET_FOR_URL_ENCODING = "UTF-8";

public static String decodeRequest(String parameter)
        throws UnsupportedEncodingException {
    System.out.println(Charset.defaultCharset()); // EDIT: suggested by @Esailija
    if (parameter == null)
        return null;
    System.out.println("decode - request.getBytes(\"iso-8859-1\"):"
            + new String(parameter.getBytes("iso-8859-1")));
    System.out.println("decode - request.getBytes(\"iso-8859-1\") BYTES:"
            + parameter.getBytes("iso-8859-1"));
    for (byte iterable_element : parameter.getBytes("iso-8859-1")) {
        System.out.println(iterable_element);
    }
    System.out.println("decode - request.getBytes(\"UTF-8\"):"
            + new String(parameter.getBytes(CHARSET_FOR_URL_ENCODING))); // UTF-8
    return URLDecoder.decode(new String(parameter.getBytes("iso-8859-1")),
            CHARSET_FOR_URL_ENCODING);
}

所以Tomcat:

windows-1252 // EDIT: suggested by @Esailija
decode - request.getBytes("iso-8859-1"):╬╡╬╗╬╗╬╖╬╜╬▒╧?╬▒
decode - request.getBytes("iso-8859-1") BYTES:[B@d171825
-50
-75
-50
-69
-50
-69
-50
-73
-50
-67
-50
-79
-49
-127
-50
-79
decode - request.getBytes("UTF-8"):├Ä┬╡├Ä┬╗├Ä┬╗├Ä┬╖├Ä┬╜├Ä┬▒├?┬?├Ä┬▒
ProfileController.doGet() user name DECODED : ╬╡╬╗╬╗╬╖╬╜╬▒╧?╬▒
???????? // user Dao System.out.println("ελληναρα");
com.mysql.jdbc.JDBC4PreparedStatement@67322bd9: SELECT * FROM users WHERE username='╬╡╬╗╬╗╬╖╬╜╬▒╧?╬▒'
ProfileController.doGet() user : null

日食:

UTF-8 // EDIT: suggested by @Esailija
decode - request.getBytes("iso-8859-1"):ελληναρα
decode - request.getBytes("iso-8859-1") BYTES:[B@44c353ae
-50
-75
-50
-69
-50
-69
-50
-73
-50
-67
-50
-79
-49
-127
-50
-79
decode - request.getBytes("UTF-8"):ελληναÏα
ProfileController.doGet() user name DECODED : ελληναρα
ελληναρα // user Dao System.out.println("ελληναρα");
com.mysql.jdbc.JDBC4PreparedStatement@73aae7c6: SELECT * FROM users WHERE username='ελληναρα'
ProfileController.doGet() user : com.ted.domain.User@4b22015d

编辑:如果我在首选项>工作区>文本文件编码中更改eclipse编码并设置默认值(Cp1252)

windows-1252
decode - request.getBytes("iso-8859-1"):λαλακης
decode - request.getBytes("iso-8859-1") BYTES:[B@5ef1946a
-50
// same bytes ....
decode - request.getBytes("UTF-8"):λαλακη�‚
ProfileController.doGet() user name DECODED : λαλακης
ελληναÏ?α
com.mysql.jdbc.JDBC4PreparedStatement@4646ebd8: SELECT * FROM users WHERE username='λαλακης'
ProfileController.doGet() user : null

并且 Eclipse 也失败了


注意: Tomcat 确实在地址栏中打印了正确的 url

在此处输入图像描述

日食很好:

在此处输入图像描述

请注意,Firefox 会自动解码 Url(令我困惑)

于 2012-10-18T13:49:23.920 回答