如何使用XMLHttpRequest获取响应形式的servlet

时间:2012-06-02 08:39:19

标签: javascript ajax xmlhttprequest jetty

我有一个运行的jetty服务器响应get请求。如果我使用浏览器发出请求: localhost:8080 / sp或127.0.0.1:8080/sp 我得到了正确的数据。

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 get请求?

我甚至在/ etc / hosts文件中添加了一个条目:     127.0.0.1 foo.com 并改变了JS网址无济于事。

1 个答案:

答案 0 :(得分:0)

是的,问题在于它是跨域请求。

2种可能的解决方案:

  • 使用JSONP
  • 设置CORS headers,以便浏览器知道它可以嵌入您的servlet答案

两者都很简单,但第二个优点是你只需要在servlet代码中设置头文件。例如:

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

另一件事:小心打开http://中的html文件,而不是文件://。