2

我需要传达我的 java 应用程序和我的网站。出于某种原因,我选择使用可用的 HttpServer 类。(我真的不知道 PHP)。我看了这个问题:simple HTTP server in Java using only Java SE API

这是我使用的 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!
[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], [*/*]]

有人能告诉我为什么它被调用两次吗?看起来它与缓存有关,我必须阅读一些有关 Http 协议的内容。我应该如何识别每个请求类型?我应该如何处理它们?

4

3 回答 3

5

尝试输出浏览器请求的路径(即域之后 URL 的一部分)。

请记住,输出中包含的所有资源(css、外部 javascript 文件、图片、flash 内容)(假设此输出是 HTML)都是使用单独的附加 HTTP 请求从服务器加载的。

大多数浏览器还从网站获取其他信息,例如favicon.ico文件,我怀疑这里可能就是这种情况。

于 2013-07-14T21:33:44.450 回答
0

尝试在控制台上打印处理程序对象,以确保是否附加了多个处理程序,或者是否同一处理程序被调用了两次,还要记录线程以便我们知道哪个线程实际调用了处理程序。

像这样的东西:

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 语句,并使用带有 Firebug 插件的 Firefox 来观察每次点击时浏览器发送的 post 请求。这将为您提供有关何时生成请求以及请求通过 POST 的详细信息(这可能不明显,因为它不存在于 url 中)。看看这个你就会知道你的处理程序何时被触发。

于 2014-04-30T09:55:27.647 回答