0

これは私を狂わせてきました。

だから私は(非常に単純なバニラサーブレット3)Webアプリを持っています。Eclipseで実行すると、すべて問題ありません。特に、Unicode(ギリシャ語)ユーザー名でアカウントを登録してから、サイト管理者としてログインし、ユーザーのプロファイルにアクセスすることができます。warをにエクスポートし $CATALINA_HOME\webapps、起動$CATALINA_HOME\bin\startup.batし、ブラウザでサイトを開き、adminとしてログインし、ユーザープロファイルにアクセスしてみてください。ユーザー名などは空白で表示されます。
のファイル...\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メソッド(スリム化):

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);
}

db呼び出しは:

            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:[B@529b9ed
-49
-123
-49
-125
-49
-124
-50
-75
-49
-127
-50
-71
-50
-79
decode - request.getBytes("UTF-8"):├?┬à├?┬â├?┬ä├Ä┬╡├?┬?├Ä┬╣├Ä┬▒
ProfileController.doGet() user name DECODED : ╧à╧â╧ä╬╡╧?╬╣╬▒
com.mysql.jdbc.JDBC4PreparedStatement@766d7940: SELECT * FROM users WHERE username='╧à╧â╧ä╬╡╧?╬╣╬▒'
????????
ProfileController.doGet() user : null

Eclipseが印刷している間:

decode - request.getBytes("iso-8859-1"):υστερια
decode - request.getBytes("iso-8859-1") BYTES:[B@4b6a6bdf
-49
-123
-49
-125
-49
-124
-50
-75
-49
-127
-50
-71
-50
-79
decode - request.getBytes("UTF-8"):ÏÏÏεÏια
ProfileController.doGet() user name DECODED : υστερια
com.mysql.jdbc.JDBC4PreparedStatement@37d02427: SELECT * FROM users WHERE username='υστερια'
ελληναρα
ProfileController.doGet() user : com.ted.domain.User@63144ceb

なんらかの理由で、dbに到達するクエリは何かおかしなものだと思います-EclipseのどこがTomcatのελληναραを出力するかに注意してください???????? 一方、Unicodeユーザー名(υστερια)は、???????ではなく╧à╧â╧ä╬╡╧?╬╣╬▒として出力されます。

したがって、問題は、Eclipseデプロイメントとtomcatデプロイメントの間で何が変わるのかということです。DBがnullを返すのはなぜですか?私は本当にこれを無駄にデバッグしようとしました

ヘルプ

編集:行 statement.setString(1, username);を置き換えてstatement.setString(1, "υστερια");も失敗はありません。したがって、この行が実行されるまでに、バイトは壊されます-バイトは1つずつ同じであることに注意してください

EDIT2:ローカルホストEclipseでのTomcat v7.0サーバーはVM引数を起動します(読みやすくするために分割):

-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"

注意アプリの起動は動的に作成されます

2013.03.30を編集:これは現在githubにあります-そして私のより一般的な質問をここで見てください

4

1 に答える 1

0

これは最終的にここで答えられました。

答えの要点は、私がeclipseにデフォルトのエンコーディングUTF-8とTomcatを持っていたwindows-1252ので、エンコーディングを指定せずにnew String()を呼び出すと、それらはbyte[]をcharsに変換するために使用されます。やってる

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

別のエンコーディング(ASCIIなど)はおそらく(Java 7 nioより前では動作が定義されておらず、制御できません)、デコードできない文字を次の?ように置き換えるため、デフォルトではISO-8859を使用しませんparameter。文字列が破損します(ISO-8859-1エンコーディングとバイナリデータの保存を参照) 。 。

したがって、デフォルトでISO-8859を使用して変換を実行するためのTomcatへの勇気request.getParameter()と、getParameterがURLデコードを実行することについてもドキュメントで言及していない、server.xmlをオーバーライドするエンコーディングを指定することは言うまでもなく、Javaee仕様の人にブーイングします。 。

于 2014-03-26T13:26:42.917 に答える