programing

JQuery Ajax 게시 매개 변수가 IE에서 전송되지 않는 경우가 있습니다.

codeshow 2023. 9. 9. 10:19
반응형

JQuery Ajax 게시 매개 변수가 IE에서 전송되지 않는 경우가 있습니다.

제가 겪고 있는 문제는 jquery ajax post를 사용할 때 매우 낮은 빈도(< 2%)로 post 매개 변수가 서버에 도달하지 못한다는 것입니다.접속 로그에 포스트 요청이 보입니다.IE에서만 발생하는 것 같습니다(로그에서 7, 8, 9에서 관찰했습니다).

전화를 "게시" 유형에서 "받기" 유형으로 바꾸면 문제가 사라집니다.

IE에서 이런 이상한 행동을 본 사람이 또 있습니까?감사합니다!

다양한 ajax 호출에 대해 본 적이 있지만, 대표적인 것은 다음과 같습니다.

var data= {
    "guess" : "m1",
    "eas" : "hello world"
};

$.ajax({
    url: "http://myco.com/ajaxcall.action",
    data: data,
    type : 'post',
    dataType: 'json',
    success: function(data) {},
    error: function() {}
});

업데이트: "cache: false"를 전달해도 문제가 해결되지 않습니다.

저는 지난 한 주 동안 제 어플리케이션(JQuery가 아닌 Dojo 사용)에서 유사한 문제를 추적했습니다.당신의 설명과 발생 빈도로 보아 같은 문제라고 생각합니다.

브라우저와 서버 간에 HTTP 지속 연결이 사용되는 경우(기본 동작), HTTP 연결은 언제든지 서버에 의해 종료될 수 있습니다.이렇게 하면 서버가 연결을 닫는 동시에 브라우저가 새로운 요청을 보내기 시작할 때 매우 작은 타이밍 홀이 생성됩니다.대부분의 브라우저는 다른 연결을 사용하거나 새 연결을 열고 요청을 다시 보냅니다.RFC 2616 섹션 8.1.4에서 제시된 동작은 다음과 같습니다.


클라이언트, 서버 또는 프록시는 언제든지 전송 연결을 닫을 수 있습니다.예를 들어, 서버가 "아이들" 연결을 닫기로 결정한 시점에 클라이언트가 새로운 요청을 보내기 시작했을 수 있습니다.서버 입장에서는 유휴 상태에서 연결이 닫히고 있지만 클라이언트 입장에서는 요청이 진행 중입니다.

이는 클라이언트, 서버 및 프록시가 비동기적 근접 이벤트로부터 복구할 수 있어야 함을 의미합니다.클라이언트 소프트웨어는 전송 연결을 다시 열고 요청 시퀀스가 idempotent인 한 사용자 상호 작용 없이 중단된 요청 시퀀스를 재전송해야 합니다(섹션 9.1.2 참조).


인터넷 탐색기는 요청이 발생할 때 요청을 재전송하려고 시도하지만 POST일 때는 헤더(Content-Length 포함)를 전송하여 요청을 망칩니다. 하지만 실제 데이터는 없습니다.이는 잘못된 형식의 요청이므로 항상 HTTP 오류로 이어져야 합니다(일반적으로 오지 않는 데이터를 기다리는 시간이 조금 지난 후).

이 버그는 Microsoft에서 KB 895954로 문서화되어 있습니다(http://support.microsoft.com/kb/895954) 참조).마이크로소프트는 IE 6에서 이 버그를 처음 인지했습니다.그들은 핫픽스를 제공했고, 그 이후 IE 9를 포함한 모든 버전의 IE와 함께 핫픽스를 발송한 것으로 보입니다.수정에는 두 가지 문제가 있습니다.

  1. 핫픽스는 기본적으로 활성화되어 있지 않습니다.regedit을 사용하여 정말 이상한 키를 만들어야 수정할 수 있습니다. HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\메인\기능 컨트롤\FEATURE_SKIP_POST_RETRY_ON_INTERN WRITEFILE_KB8954.

  2. 고친다고 문제가 해결되는 것은 아닙니다."고정" 동작은 요청을 전송하려고 할 때 연결이 닫히면 재전송을 시도하지도 않는 것입니다.단순히 자바스크립트 어플리케이션에 오류를 전달합니다.

코드에 오류 처리기를 추가하고 실패할 경우 직접 요청을 다시 게시해야 하는 것으로 보입니다.저는 제 애플리케이션을 위해 이 솔루션을 알아보고 있습니다.문제는 쿼리 전송 실패 또는 쿼리 결과 서버에서 다시 전송된 오류(이 경우 재전송하고 싶지 않음)로 인해 발생한 오류인지 여부를 알 수 없다는 것입니다.

웹 서버를 시뮬레이션하기 위해 C 프로그램을 작성하고 브라우저가 어떻게 처리하는지 보기 위해 연결을 명시적으로 닫습니다.IE는 오류 동작을 100% 재현하고 Firefox, Safari 및 Chrome은 다른 연결에서 POST를 100% 다시 전송하여 복구한다는 것을 발견했습니다.아마 대답은 "IE를 사용하지 마세요." 입니다.

질문에 대한 직접적인 답변으로:네, 방금 이 문제를 발견했고 합당한 설명을 찾을 수 없었습니다.IE에만 영향을 미치며 매우 낮은 빈도로 IE 버그에서 산발적인 jQuery Ajax라는 결론에 도달하는 데 오랜 시간이 걸렸습니다.이 상태에서 서버에서 오류를 반환하고 1초 지연 후 데이터를 다시 게시하여 문제를 '수정'해야 했습니다!

해키는 지옥 같았지만 유일한 방법인 것 같았습니다.

DOM 요소와의 충돌 등이 전혀 발생하지 않았으며 논리적인 이유도 없습니다. 페이지는 사용자가 여러 번 성공적으로 업데이트할 수 있으며 간헐적인 오류가 발생합니다.

벌레가 틀림없습니다.

인터넷 익스플로러에서는 캐싱을 방지해야 한다고 생각합니다.옵션 캐시를 false로 설정해 봅니다.

예:

$.ajax({
    url: "http://myco.com/ajaxcall.action",
    data: data,
    type : 'post',
    dataType: 'json',
    success: function(data) {},
    error: function() {},
    cache: false
});

PHP로 전송되는 param은 IE로부터 in.GET:

$.ajax ({
     url: "path/to/ajax.php"
    ,method: "POST"
    ,data: {
         var1: "value1"
        ,var2: true
        ,varX: 123123
    }
    ,cache: false
    ,success: function (data) {
        alert (data);
    }
});

그렇다면 PHP에서는 POST 대신 REQUEST를 사용해야 합니다.

$var1 = $_REQUEST ["var1"]; // value1
$var2 = $_REQUEST ["var2"]; // true
$var3 = $_REQUEST ["var3"]; // 123123

이 예제는 IE7과의 호환성을 위해 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/6941898/jquery-ajax-post-parameters-sometimes-not-sent-on-ie

반응형