1

リクエストの取得に応答するjettyサーバーを実行しています。ブラウザを使用してリクエストを行うと、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 Webサーバー(ポート80)とpython SimpleHTTPServer(ポート3000)の両方を使用してWebページを提供しようとしました。

どちらの場合も、応答は空です。

<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 を使用してサーブレットと通信するようにセットアップを変更するにはどうすればよいですか? JS から HTTP get リクエストを作成できる他の方法はありますか?

/etc/hosts ファイルに 127.0.0.1 foo.com というエントリを追加し、JS URL を無効に変更しました。

4

1 に答える 1

0

はい、問題はそれがクロス ドメイン リクエストであることです。

2つの可能な解決策:

  • JSONPを使用する
  • CORSヘッダーを設定して、ブラウザがサーブレットの回答を埋め込む可能性があることを認識できるようにします

どちらも簡単ですが、2 つ目の方法には、サーブレット コードでヘッダーを設定するだけでよいという利点があります。例えば ​​:

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

別のこと: file:// ではなく http:// で HTML ファイルを開くように注意してください。

于 2012-06-02T08:41:49.937 に答える