2012-06-02 52 views
1

我有一個運行的Jetty服務器,它響應獲取請求。如果我使用瀏覽器發出請求: localhost:8080/sp或127.0.0.1:8080/sp 我得到正確的數據。如何使用XMLHttpRequest獲取響應表單servlet

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.setContentType("application/json"); 
response.setStatus(HttpServletResponse.SC_OK); 

PrintWriter out = response.getWriter(); 
out.println("{foobar: true"}); 
response.flushBuffer(); 
out.flush(); 
out.close(); 
} 

但是當我嘗試訪問使用JS相同的URL響應正文爲空。 我已經嘗試了使用OS X網絡服務器(端口80)和python SimpleHTTPServer(端口3000)的網頁。

在這兩種情況下,響應都是空的。

<h1>Single Test Page</h1> 

<script> 

var httpReq = null; 
var url = "http://127.0.0.1:8080/sp"; 

window.onload = function(){ 
    var myRequest = new XMLHttpRequest(); 
    myRequest.open('get', url); 
    myRequest.onreadystatechange = function(){ 
     if ((myRequest.readyState == 4) || (myRequest.status == 200)){ 
      alert(myRequest.responseText); 
     } 
    } 
    myRequest.send(null); 
} 

</script> 

難道這是xss攻擊預防的問題嗎? 如何更改我的設置以使用JS與我的servlet交談? 有沒有其他方法可以讓JS從HTTP獲取請求?

我甚至添加了一個條目到我的/ etc/hosts文件中: 127.0.0.1 foo.com 並且改變了JS的URL無濟於事。

回答

0

是的,問題是這是一個跨域請求。

2個可能的解決方案:

  • 使用JSONP
  • 設置CORS headers,使瀏覽器知道它可以嵌入你的servlet的答案

兩者都容易,但第二個的優點是你只需在servlet代碼中設置標題即可。例如:

response.setHeader("Access-Control-Allow-Origin", "*"); 
    response.setHeader("Access-Control-Request-Method", "GET"); 

另一件事:小心在http://中打開您的html文件,而不是file://。

相關問題