2011-04-07 2 views
2

대략 동일한 시간에 같은 자바 서블릿에 여러 개의 비동기 AJAX 호출을 보내는 이상한 결과가 나타납니다.자바 서블릿 - Ajax 요청이 혼합 응답으로 돌아옴

예를 들어, jQuery를 사용하여 동시에 두 개의 AJAX 요청을 보냈다고 가정 해 보겠습니다.

//ajax call foo 
$.post('LookupServlet', { 
    method: 'findFoo' 
}; 

//ajax call bar 
$.post('LookupServlet', { 
    method: 'findBar' 
}; 

내 서블릿에서 주어진 메소드를 호출합니다. 이 메서드는 스트림에 응답을 씁니다.

이상한 점은 foo가 때때로 bar에 대한 응답을 얻는다는 것입니다. 그 반대. 또는 때로는 하나의 아약스 호출이 두 응답을 얻고 있습니다. 또는 하나의 요청은 응답을 얻고 다른 요청은 응답을 얻지 못합니다.

이전에는 다른 서버 측 언어에서 본 적이 전혀 없었습니다. 심지어 가능하다는 것도 몰랐습니다. 왜 이런 일이 일어날 지에 대한 이론이 있습니까? 동시 요청이 교차 응답을 얻을 수있는 경우 Java 서블릿은 어떻게 작동합니까?

+0

서블릿 소스에 액세스 할 수 있습니까? 원격 디버그 할 수 있습니까? – Davidann

+0

예, 원본이 있습니다. 나는 자바에 원격 디버깅에 익숙하지 않다. –

+0

충분합니다. 그것은 어려운 일이 될 수 있습니다. 서블릿 컨테이너가 원격 디버깅 수행 방법에 대한 Tomcat [here are instructions] (http://wiki.apache.org/tomcat/FAQ/Developing#Q2) 인 경우 – Davidann

답변

3

가능한 원인은 서블릿이 스레드로부터 안전하다고 기록되지 않았기 때문입니다. 서블릿 메소드가 포함 된 객체는 많은 동시 요청에 응답하는 데 사용될 수 있습니다. 이 메소드가 클래스 레벨 변수를 사용하여 응답을 작성하면 요청이 '혼합'됩니다.

그래서 .. 요청 # 1이 들어올는 서블릿 인스턴스 예 # 1

적절한 방법은 결과를 계산하는 클래스 변수를 사용하여 시작 인스턴스 # 1에 호출에 할당된다. 인스턴스 # 1.myVariable = "어쩌구"

지금, 요청 # 2가 오면이 또한 다시 인스턴스 # 1

에 할당, 적절한 방법은 1 인스턴스 번호를 설정 인스턴스 # 1에 호출됩니다. myVariable = "Foo"

.. 첫 번째 요청이 완료되는 동안 인스턴스 # 1. myVariable ... "Foo"가 반환됩니다!

.. 두 번째 요청이 완료되고 "Foo"가 반환됩니다.

+0

고맙습니다. 설명해 주셔서 감사합니다. 그게 내가 찾고 있던 ... 그리고 나는 클래스 수준의 변수를 사용하여 응답을 보내고 있습니다! –

+0

후속 조치로, PrintWriter를 클래스 변수에서 로컬 변수로 변경했으며 모두 정상입니다. 다시 한번 감사드립니다. –

+0

아마도 이것은 여기에 내 질문에 대한 답변입니다 http://stackoverflow.com/questions/38971527/jquery-ajax-sucess-response-parameter-overwriting?noredirect=1#comment65297742_38971527 –

관련 문제