2011-07-11 3 views
1

GET/POSTに最適なJQueryの$ .ajax()を使用するシンプルなjavascriptがあります。ただし、プロキシの背後にあるユーザーの場合、以下の記事で説明したように407エラーが発生します。あなたが見るようには407のエラーを検出し、それ以降のすべてのリクエストに適用されます

407 Proxy Authentication Required

今、私はJSONPの使用量は、回避策として十分だろうと述べているポストを更新しました。今のところ、JSONPが必要なときだけ、JSONPを使いたくないのですか?

function original() { 
    $.ajax({ 
     url: "http://somecool.url/foo", 
     data: { id:"bar"}, 
     statusCode: { 
      407: foo() 
     }, 
     success: function(data) { 
      $.each(data, function(k,v) { 
       $('#foo').append("<li>" + k + ":" + v + "</li>"); 
      }); 
     } 
    }); 
}  


function foo() { 
    $.ajax({ 
     url: "http://somecool.url/foo", 
     data: { id:"bar" }, 
     dataType: "jsonp", 
     success: function(data) { 
      $.each(data, function(k,v) { 
       $('#foo').append("<li>" + k + ":" + v + "</li>"); 
      }); 
     } 
    }); 
} 

$(document).ready(function() { 
    original(); 
}); 

それは、すべての後続の要求がoriginal()機能に行き、foo()機能に行かないようにプロキシ問題があるときに407エラーを返す最初の障害の状態を持続することは可能ですか?

答えて

1

私の元の回答(下)は、あなたの質問のコードに対応するための関数名の上書きを扱っていました。しかし、より良い解決策があります。なぜなら、407応答コードを受け取った場合にのみ、すべてのリクエストをJSONPに切り替えるだけだからです。

$.ajaxSetup()はまさにそれを実行するために設計されました。この戦略では

function original() { 
    $.ajax({ 
     url: "http://somecool.url/foo", 
     data: { id:"bar"}, 
     statusCode: { 
      407: function() { 
       $.ajaxSetup({ dataType: "jsonp" }); 
       // Now all AJAX requests use JSONP, retry. 
       original(); 
      } 
     }, 
     success: function(data) { 
      $.each(data, function(k,v) { 
       $('#foo').append("<li>" + k + ":" + v + "</li>"); 
      }); 
     } 
    }); 
} 

は、一度407が受信され、将来のすべてのAJAX要求はJSONPを使用します。歴史の便宜上



は、ここに私のオリジナルの答えです。あなたは永久にあなたが初めて407応答コードを受信したときにoriginalに保存されている機能変更することができます

:その時から

function original() { 
    $.ajax({ 
     url: "http://somecool.url/foo", 
     data: { id:"bar"}, 
     statusCode: { 
      407: function() { 
       window.original = foo; 
       foo(); 
      } 
     }, 
     success: function(data) { 
      $.each(data, function(k,v) { 
       $('#foo').append("<li>" + k + ":" + v + "</li>"); 
      }); 
     } 
    }); 
} 

を、名前originalfoo()を参照します。あなたも、機能を変更すると同時に、その交換を呼び出すことができます。

407: function() { 
    (window.original = foo)(); 
} 
+1

を明確にするだけで... ajaxSetup()と設定した内容は、そのページの生活のためにのみ存在する...ユーザーは離れて移動した場合と、戻ってきたら、再度セットアップする必要がありますか?私はこれを回避する唯一の方法は、セッションやクッキーを介していると思う..素晴らしい答えが、ありがとう。 – sdolgy