2013-07-14 68 views
1

我需要溝通我的Java應用程序和我的網站。出於某種原因,我選擇使用HttpServer類。 (我真的不知道PHP)。我看了看這個問題:simple HTTP server in Java using only Java SE APIJava HttpServer。 HttpHandler調用兩次

這是我用的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協議的內容。我應該如何識別每種請求類型?我應該如何處理它們?

+0

來吧好友,瀏覽器總是第一次發送兩個請求,一個是獲取實際的url數據,另一個是獲取/favicon.ico資源,它是小圖標,就像你看到的堆棧溢出的 – 2013-07-14 21:46:11

+0

那麼,我從來不知道。我從來沒有看過網絡編程 – black

回答

4

嘗試輸出該瀏覽器請求的路徑(這是該URL的域後的部分)。

請記住,包括在你的輸出的所有資源(CSS,外部JavaScript文件,圖片,閃光的東西)(假設這個輸出HTML)使用單獨的,額外的HTTP請求從服務器加載。

大多數瀏覽器也獲取來自網站的附加相關信息,如favicon.ico文件,我懷疑這可能是這裏的情況。

+0

謝謝!你是對的。 – black

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

} 
0

瀏覽器發送2個請求,如果有一個AJAX調用一些地方在HTML/JSP代碼,那麼它可能會在處理多次觸發(4)。

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

如果用java SOP,嘗試在HTML代碼中添加的console.log語句和使用Firefox Firebug插件來觀察POST請求通過瀏覽器每次點擊發送難以調試。這會告訴你什麼時候生成的請求和請求通過POST的細節(這可能不明顯,因爲它不存在於url中)。看着這個,你會知道你的處理程序何時被觸發。