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协议的内容。我应该如何识别每个请求类型?我该如何处理他们
# 1 楼答案
浏览器发送2个请求,如果HTML/JSP代码中的某个地方有AJAX调用,则可能会多次触发处理程序(4)
http://www.w3schools.com/ajax/ajax_xmlhttprequest_onreadystatechange.asp
如果使用JavaSOP进行调试很困难,请尝试添加控制台。在html代码中记录语句,并使用Firefox和Firebug插件来观察浏览器在每次单击时发送的post请求。这将为您提供有关何时生成请求以及请求通过POST的详细信息(这可能不明显,因为url中不存在)。看看这个,你就会知道你的处理器什么时候被触发
# 2 楼答案
尝试在控制台上打印处理程序对象,以确保是否连接了多个处理程序,或者是同一个处理程序被调用了两次,还要记录线程,以便了解哪个线程实际调用该处理程序
大概是这样的:
# 3 楼答案
尝试输出浏览器请求的路径(该路径是域后URL的一部分)
请记住,输出中包含的所有资源(css、外部javascript文件、图片、flash内容)(假设此输出为HTML)都是使用单独的附加HTTP请求从服务器加载的
大多数浏览器也会从网站获取额外的信息,比如
favicon.ico
文件,我怀疑这里可能就是这种情况