2013-02-16 13 views
0

这一直使我疯狂。当从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" 

NBthe launch for the app is created dynamically

编辑2013年3月30日:这是现在github - 看看我的更普遍的问题here

+0

你想用这些请求解码和编码做什么? – 2013-02-17 13:38:09

+0

@JB Nizet:请参阅:http://stackoverflow.com/a/12764128/281545。我试图避免必须配置tomcat将URIEncoding配置为UTF-8。无论我在做什么,都是在eclipse中运行应用程序时运行,而不是在tomcat中运行。 – 2013-02-17 14:03:37

+0

当你收到一个参数时,它已经是一个String了,所以Tomcat已经使用它的默认编码将这些字节转换成了一个String。太晚了。 – 2013-02-17 14:05:50

回答

0

这终于回答了here

答案的要点是,我日食有作为默认编码UTF-8和Tomcat windows-1252所以当我打电话新的字符串(),而不指定那些用于tranlate到字符字节[]的编码。这样做

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

解决了这个问题 - 这将但如果在tomcat

request.getParameter("user") // url decoding is performed by tomcat - using the 
// URIEncoding from server.xml or by default ISO-8859 

将默认ISO-8859作为另一种编码(比如ASCII)将可能(行为未定义未使用在Java 7 nio之前不可控制)用?替换不可解码的字符,所以parameter字符串将被破坏(请参阅ISO-8859-1 encoding and binary data preservation)。

对于tomcat来说,它默认执行转换,在其request.getParameter()中使用ISO-8859进行转换,而对于那些甚至在文档中甚至没有提到getParameter将执行URL解码的Java ee规范家伙,更let论让我们指定编码,覆盖server.xml。

相关问题