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 - 而 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<c:url>
/<c:param>
在适用的情况下在 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中运行时导出的战争(部分)失败的主要内容,如果未能解决你的问题,请参考以下文章