我有一个运行着的码头服务器,它响应获取请求。如果我使用浏览器发出请求:本地主机: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 Webserver(端口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 网址更改为无济于事。
是的,问题是它是一个跨域请求。
2种可能的解决方案:
- 使用 JSONP
- 设置 CORS 标头,以便浏览器知道它可能嵌入您的 servlet 答案
两者都很容易,但第二个的优点是您只需要在 servlet 代码中设置标头。例如:
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Request-Method", "GET");
另一件事:小心打开你的html文件,http://而不是 file://。