1

我有一个正在运行的码头服务器,它响应获取请求。如果我使用浏览器发出请求: 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 获取请求?

我什至在我的 /etc/hosts 文件中添加了一个条目:127.0.0.1 foo.com 并更改了 JS url 无济于事。

4

1 回答 1

0

是的,问题是它是一个跨域请求。

2个可能的解决方案:

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

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

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

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

于 2012-06-02T08:41:49.937 回答