我在eclipse juno中有一个webapp - 当我点击在服务器上运行运行正常 - 在eclipse的浏览器(我在Windows上)或在FF中。
右键单击> 出口战争>将其转储到$ CATALINA_HOME / webapps>一切都很好(解压好了) 除了
我的自定义标签 - 我有一个显然未读取的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
问题:
web.xml
? (在我的回答中解决,应该是另一个问题)代码位于github - 在文件INSTRUCTIONS.txt中有详细的说明来设置项目并重现下面答案中描述的错误。
Tomcat 7.0.32,eclipse 4.2,java 1.7.9
答案 0 :(得分:5)
为了正确解码URI,您需要Tomcat中的URIEncoding连接器属性:
<connector ... URIEncoding="UTF-8" ... />
查看我的咆哮https://stackoverflow.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");
}
答案 1 :(得分:1)
有一件事有助于添加到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。
奇怪的是:当我用系统打印用户名时,我得到????在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
Eclipse:
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中更改eclipse编码&gt;工作区&gt;文本文件编码并设置默认值(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也失败
NB: Tomcat会在地址栏中打印正确的网址
Eclipse很好:
请注意,Firefox会自动解码Url(令我困惑的)