2012-06-02 49 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://。

相关问题