这一直使我疯狂。当从eclipse运行时,Webapp的行为与预期相似,而当战争失败时导出
所以我有一个(非常简单的香草servlet 3)网络应用程序。当我在eclipse中运行时,一切都很好。其中我能够注册一个帐户与Unicode(希腊)用户名,然后以网站管理员身份登录并访问用户的配置文件好吧。当我将战争导出为$CATALINA_HOME\webapps
时,启动$CATALINA_HOME\bin\startup.bat
,在浏览器中打开该站点,以管理员身份登录并尝试访问用户配置文件,用户名等显示为空白。
中...\apache-tomcat-7.0.32\conf
和...\eclipse_workspaces\javaEE\Servers\Tomcat v7.0 Server at localhost-config
的那些文件不同之处仅在(在server.xml
)的行:
<Context docBase="ted2012" path="/ted2012" reloadable="true"
source="org.eclipse.jst.jee.server:ted2012"/>
其是蚀的事情。
doGet方法(薄型化)在型材的servlet:
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
final String username = Helpers.decodeRequest(request
.getParameter("user"));
if (username != null) {
User user = null;
try {
System.out
.println("ProfileController.doGet() user name DECODED : "
+ username);
user = userService.getUserWithUsername(username); // THIS FAILS
System.out.println("ProfileController.doGet() user : " + user);
request.setAttribute("userToShow", user);
} catch (ServiceExDBFailure e) {
log.debug("ProfileController::doGet", e);
request.setAttribute("ErrorString", e.getMessage());
}
sc.getRequestDispatcher(OTHERPROFILE_JSP)
.forward(request, response);
return;
} else {
//does not apply
}
}
解码方法是:
public static String decodeRequest(String parameter)
throws UnsupportedEncodingException {
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);
}
虽然分贝呼叫是:
statement = conn.prepareStatement(query);
statement.setString(1, username);
System.out.println("ελληναρα");
System.out.println(statement);
set = statement.executeQuery();
if (set.next()) {
User user = new User();
// user.setId(set.getInt("ID"));
user.setUsername(set.getString("username"));
user.setName(set.getString("name"));
user.setSurname(set.getString("surname"));
user.setPassword(set.getString("password"));
user.setEmail(set.getString("email"));
user.setRole(RolesENUM.values()[set.getInt("role")]);
return user; // if the set is empty null is returned
}
Tomcat的打印:
decode - request.getBytes("iso-8859-1"):╧à╧â╧ä╬╡╧?╬╣╬▒
decode - request.getBytes("iso-8859-1") BYTES:[[email protected]
-49
-123
-49
-125
-49
-124
-50
-75
-49
-127
-50
-71
-50
-79
decode - request.getBytes("UTF-8"):├?┬à├?┬â├?┬ä├Ä┬╡├?┬?├Ä┬╣├Ä┬▒
ProfileController.doGet() user name DECODED : ╧à╧â╧ä╬╡╧?╬╣╬▒
[email protected]: SELECT * FROM users WHERE username='╧à╧â╧ä╬╡╧?╬╣╬▒'
????????
ProfileController.doGet() user : null
个
而Eclipse的打印:
decode - request.getBytes("iso-8859-1"):υστερια
decode - request.getBytes("iso-8859-1") BYTES:[[email protected]
-49
-123
-49
-125
-49
-124
-50
-75
-49
-127
-50
-71
-50
-79
decode - request.getBytes("UTF-8"):ÏÏÏεÏια
ProfileController.doGet() user name DECODED : υστερια
[email protected]: SELECT * FROM users WHERE username='υστερια'
ελληναρα
ProfileController.doGet() user : [email protected]
我相信,由于某种原因获取到数据库查询是一些疯狂的 - 请注意,凡在日食打印在Tomcat中打印ελληναρα????????而unicode用户名(υστερια)打印为╧à╧╧╧╧╬╡╧╬╣╬而不是?????。。
所以问题是 - Eclipse部署和tomcat部署之间有什么变化?为什么地狱数据库返回null?我真的真的妄图
帮助调试这个
编辑:与statement.setString(1, "υστερια");
更换线statement.setString(1, username);
没有失败。所以由这个时间线运行字节错位了 - 虽然通知的字节是相同的一个个
EDIT2:的Tomcat V7.0服务器在本地主机Eclipse启动VM ARGS(拆分为便于阅读):
-Dcatalina.base="C:\Dropbox\eclipse_workspaces\javaEE\.metadata\.plugins
\org.eclipse.wst.server.core\tmp1"
-Dcatalina.home="C:\_\apache-tomcat-7.0.32"
-Dwtp.deploy="C:\Dropbox\eclipse_workspaces\javaEE\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps"
-Djava.endorsed.dirs="C:\_\apache-tomcat-7.0.32\endorsed"
NB:the launch for the app is created dynamically
编辑2013年3月30日:这是现在github - 看看我的更普遍的问题here
你想用这些请求解码和编码做什么? – 2013-02-17 13:38:09
@JB Nizet:请参阅:http://stackoverflow.com/a/12764128/281545。我试图避免必须配置tomcat将URIEncoding配置为UTF-8。无论我在做什么,都是在eclipse中运行应用程序时运行,而不是在tomcat中运行。 – 2013-02-17 14:03:37
当你收到一个参数时,它已经是一个String了,所以Tomcat已经使用它的默认编码将这些字节转换成了一个String。太晚了。 – 2013-02-17 14:05:50