有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

http Java HttpServer。HttpHandler调用了两次

我需要沟通我的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协议的内容。我应该如何识别每个请求类型?我该如何处理他们


共 (3) 个答案

  1. # 1 楼答案

    浏览器发送2个请求,如果HTML/JSP代码中的某个地方有AJAX调用,则可能会多次触发处理程序(4)

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

    如果使用JavaSOP进行调试很困难,请尝试添加控制台。在html代码中记录语句,并使用Firefox和Firebug插件来观察浏览器在每次单击时发送的post请求。这将为您提供有关何时生成请求以及请求通过POST的详细信息(这可能不明显,因为url中不存在)。看看这个,你就会知道你的处理器什么时候被触发

  2. # 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();
        }
    
    }
    
  3. # 3 楼答案

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

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

    大多数浏览器也会从网站获取额外的信息,比如favicon.ico文件,我怀疑这里可能就是这种情况