2

Java アプリと Web サイトを通信する必要があります。何らかの理由で、利用可能な HttpServer クラスを使用することにしました。(私は本当にPHPを知りません)。私はこの質問を見ました: Java SE APIのみを使用したJavaの単純なHTTPサーバー

これは私が使用した HttpHandler コードです:

public class NexusHttpHandler implements HttpHandler{
    private String response;
    public NexusHttpHandler(String response){
        this.response=response;
    }

    @Override
    public void handle(HttpExchange he) throws IOException {
        System.out.println("I am called!");
        System.out.println(he.getRequestHeaders().keySet());
        System.out.println(he.getRequestHeaders().values());
        he.sendResponseHeaders(200, response.length());
        OutputStream os = he.getResponseBody();
        os.write(response.getBytes());
        os.close();
    }

}

何らかの理由で、ページが更新されるたびに「I am called」が 2 回呼び出されます。これは完全な出力です:

I am called!
[Cache-control, Host, Accept-encoding, Connection, Accept-language, User-agent, Accept]
[[max-age=0], [localhost:8080], [gzip,deflate,sdch], [keep-alive], [ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4], [Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36], [text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8]]
I am called!
[Host, Accept-encoding, Connection, Accept-language, User-agent, Accept]
[[localhost:8080], [gzip,deflate,sdch], [keep-alive], [ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4], [Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36], [*/*]]

誰かがなぜそれが2回呼び出されるのか教えてもらえますか? キャッシュに関連しているようで、Http プロトコルについて何かを読む必要があります。それぞれのリクエスト タイプをどのように識別すればよいですか? それらにどのように対処すればよいですか?

4

3 に答える 3

5

ブラウザーが要求したパス (URL のドメインの後の部分) を出力してみてください。

出力に含まれるすべてのリソース (css、外部 JavaScript ファイル、写真、フラッシュなど) (この出力が HTML であると仮定) は、別の追加の HTTP 要求を使用してサーバーから読み込まれることに注意してください。

ほとんどのブラウザーは、Web サイトからファイルなどの追加情報もフェッチしfavicon.icoます。

于 2013-07-14T21:33:44.450 に答える
0

ハンドラー オブジェクトをコンソールに表示して、複数のハンドラーが接続されているかどうか、または同じハンドラーが 2 回呼び出されているかどうかを確認し、スレッドをログに記録して、どのスレッドが実際にハンドラーを呼び出しているかを確認します。

このようなもの:

public class NexusHttpHandler implements HttpHandler{
    private String response;
    public NexusHttpHandler(String response){
        this.response=response;
    }

    @Override
    public void handle(HttpExchange he) throws IOException {
        System.out.println("handler object = " + this);
        System.out.println("called by thread = " + Thread.currentThread());
        System.out.println("I am called!");
        System.out.println(he.getRequestHeaders().keySet());
        System.out.println(he.getRequestHeaders().values());
        he.sendResponseHeaders(200, response.length());
        OutputStream os = he.getResponseBody();
        os.write(response.getBytes());
        os.close();
    }

}
于 2013-07-14T22:06:09.683 に答える
0

ブラウザーは 2 つの要求を送信します。HTML/JSP コードのどこかに AJAX 呼び出しがある場合、ハンドラーを複数回トリガーする可能性があります(4)。

http://www.w3schools.com/ajax/ajax_xmlhttprequest_onreadystatechange.asp

Java SOP を使用してデバッグするのが難しい場合は、html コードに console.log ステートメントを追加してみてください。また、Firefox と Firebug アドオンを使用して、クリックごとにブラウザから送信されるポスト リクエストを観察してください。これにより、どのリクエストがいつ生成され、リクエストが POST を通過したかについての詳細が得られます (URL に存在しないため、これは明らかではない可能性があります)。これを見ると、ハンドラーがいつトリガーされるかがわかります。

于 2014-04-30T09:55:27.647 に答える