2

PHP で Web プロジェクトがあり、Restlet フレームワークを使用する Java プロジェクトにアクセスします。Web プロジェクトは Apache で実行されており、localhost を使用してテストしています。Restlet フレームワークもドメインとして localhost を使用しますが、URL は少し異なります: localhost:8888/

これは、Ajax を使用して、上記の URL を使用して Java クラスの 1 つ (CollectionPublic) を呼び出す Javascript です。

var url = "<?php echo $config['restServer_url'] ?>collectionPublic";

var params= "pageList="+facebookPages+"&time="+time;

var client = new XMLHttpRequest();
client.open("POST", url,true);
client.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

client.onreadystatechange = function () {

  if (client.readyState != 4) return;
  if (client.status != 200 && client.status != 304) {

       alert("error "+client.status);

 } else {
       alert("success");            

 }

 callback(client);
}

if (client.readyState == 4) return;
client.send(params);

テストしたところ、URL localhost:8888/collectionPublic を使用して呼び出しが正しく行われ、CollectionPublic クラスに到達しています (クラスは正常に動作しています)。

問題は次のとおりです。この呼び出しが行われると、CollectionPublic クラスがタスクを完了するのに長い時間がかかり、ユーザーは (同じサーバー上の) 他のページにアクセスしたり、ページをリロードしたりできるはずです。ただし、これらのいずれかが発生すると、alert("error "+client.status) がポップアップし、client.status の値が 0 になります。呼び出しは中止されますが、CollectionPublic のタスクは通常どおり続行され、終了すると、 Web ページでは何も起こりません (以前はアラート ("success") が発生していました)。

これは先週機能していたので、エラーの原因を突き止めるために何時間も費やしました. 私が見つけた投稿のほとんどは、localhost と localhost:8888 は同じドメインとは見なされないため、クロスオリジン リソースの問題である可能性があると述べています。それが本当に問題であるかどうかを確認するために、 --disable-web-security 引数を使用して Chrome を起動しました (実際には無効になっていました) が、問題はまだありました。最も奇妙なことは、それが以前に機能していたことであり、コードでまったく何も変更していません。

この記事のリロードページを見たことがありますが、進行中の Ajax リクエストは空の応答とステータスをゼロとして返します。これは、私が直面しているものと非常によく似ているようです。

うまくいけば、私は自分自身を明確にしましたが、この問題について疑問がある場合は、聞いてください.

よろしくお願いします。

4

1 に答える 1

0

私は ajax リクエスト自体が正しいとは確信していません。if (client.readyState != 4) return;実際に 4 の場合を除いて、常に true になります。これはより良いかもしれません:

client.onreadystatechange = function () {
    if(client.readyState < 4) {  
        //not complete yet
        return;  
    }  

    if(client.status != 200 && client.status != 304) {  
        //an error
        alert("error "+client.status);
        return;  
    } 

    if(client.readyState === 4) {  
        //complete
        callback(client);  
    }
}

ajax 呼び出しが中止される問題については、これは正しい動作です。ページがリロードまたはアンロードされるとすぐに、すべての XHR 呼び出しがブラウザーによって中止されます。おそらくこれは、ページをローカルで表示している場合には当てはまりませんでした。ajax の進行中にユーザーがナビゲート (またはリロード) することを許可しません。回避策として、ページによって読み取られるセッション変数をクラスで設定できます。

于 2013-08-28T13:08:43.373 に答える