eclipse vs tomcat部署-项目在eclipse中运行时导出的战争(部分)失败

Posted

技术标签:

【中文标题】eclipse vs tomcat部署-项目在eclipse中运行时导出的战争(部分)失败【英文标题】:eclipse vs tomcat deployment - exported war (partially) fails while the project runs in eclipse 【发布时间】:2012-10-16 11:02:40 【问题描述】:

我在 eclipse juno 中有一个 webapp - 当我点击 在服务器上运行 时运行良好 - 无论是在 eclipse 的浏览器中(我在 Windows 上)还是在 FF 中。

右键 > export war > 将其转储到 $CATALINA_HOME/webapps > 一切正常(解压好了)EXCEPT p>

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

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

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

Tomcat 无法正确通过 URL - 请参阅我的 answer 中的图片。

问题:

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

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

Tomcat 7.0.32、eclipse 4.2、java 1.7.9

【问题讨论】:

很难给出答案,因为如果您只是 1) 将 JSP 的页面编码设置为 UTF-8,2) 将 Tomcat 的 URI 编码设置为 UTF-8 和3) 使用 JSTL &lt;c:url&gt;/&lt;c:param&gt; 在适用的情况下在 JSP 中构造编码 URL(换句话说,当您只遵循处理 UTF-8 数据的标准做法时,另请参阅 balusc.blogspot.com/2009/05/… 以更好地理解它)。 @BalusC 我试图不必编辑服务器的 xml - 它应该可以工作 - 至少它可以在 Eclipse 中正常工作 - 这个真的让我无法理解。顺便说一句,我错误地将赏金放在了这个上:正确的是***.com/questions/14914983/… 【参考方案1】:

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

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

看我的咆哮https://***.com/a/15587140/995876

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

删除decodeRequest 并且永远不要在没有明确编码参数的情况下使用new String/getBytes


另一种选择。

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

public static String decodeRequest(String parameter) 
     return new String(parameter.getBytes("iso-8859-1"), "UTF-8");

【讨论】:

谢谢 - 但为什么它在 eclipse 中正确地通过而不是在 tomcat 的出口战争中?实际上这是我试图调试的东西,我需要一个答案。假设无法编辑服务器配置。有关我的方法的详细信息,请参阅我的另一个问题:***.com/questions/14914983/…。实际上它应该可以工作(无论如何它在eclipse中都可以) - 那么失败在哪里?注意网址拼写正确 @Mr_and_Mrs_D AFAIK,战争只有应用程序,而不是 服务器 配置。 但是我不乱服务器配置!这就是我这样做的重点!代码在 github - 也许试一试? @Mr_and_Mrs_D 这是配置中放置 URIEncoding 属性 github.com/Utumno/ted2012/blob/GitHub2/conf/… 的行 我知道 - 我已经这样做了 - 我知道如何这样做 - 我不明白为什么 URLDecoder.decode(new String(parameter.getBytes("iso-8859-1")), CHARSET_FOR_URL_ENCODING); - 在 Eclipse 部署中表现良好,而不是在战争部署中 - 相信我没有悬赏被告知我必须更换连接器!我再说一遍:***.com/questions/14914983/…【参考方案2】:

有一个帮助是添加到web-xml

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

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


奇怪的事情:当我用 system out 打印用户名时,我得到 ????在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

编辑:如果我在 prefs > workspace > text file encoding 中更改 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

Eclipse 很好:

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

【讨论】:

以上是关于eclipse vs tomcat部署-项目在eclipse中运行时导出的战争(部分)失败的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse项目部署到Tomcat中路径

使用Eclipse发布Web项目并部署到Tomcat服务器

在tomcat上部署项目时,JDBC数据源无法正常工作

Eclipse下配置javaweb项目快速部署到tomcat

eclipse里部署的tomcat启动超时的解决

java eclipse tomcat清除已经部署的项目