2015-03-18 2 views
0

Я теряю рассудок, пытаясь решить эту проблему. У меня есть следующий сервлет развернут в Tomcat работает на локальном хосте: 8080-:servlet - Почему XMLHttpRequest responseText всегда пуст?

@WebServlet(urlPatterns = { "/createcon" }, asyncSupported = true) 
public class CreateCon extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    ConcurrentHashMap<String, AsyncContext> map; 
    public CreateCon() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    */ 

    public void init() { 
     map = new ConcurrentHashMap<>(); 
    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     AsyncContext context = request.startAsync(request,response); 
     context.setTimeout(10000); 
     if(!map.containsKey("Hello")) 
     map.put("Hello", context); 
     System.out.print("Inside GET"); 
    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     AsyncContext context = map.get("Hello"); 
     PrintWriter writer = context.getResponse().getWriter(); 
     writer.write(request.getParameter("message")); 
     writer.flush(); 
     System.out.print(request.getParameter("message")); 
    } 

} 

Как вы можете видеть, что я пытаюсь хранить AsyncContext, созданный в карте. Я код отлично работает в Eclipse с Tomcat. Как вы можете видеть выше, я добавил System.out.print, чтобы проверить, работает ли код правильно или нет. И он работает точно так, как ожидалось.

Но проблема с яваскриптом цен ниже:

function postMessage(){ 
    var xmlhttp = new XMLHttpRequest(); 
    xmlhttp.onreadystatechange=function(){ 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) { 

     alert(xmlhttp.responseText); 
     } 
    } 
    xmlhttp.open("POST", "/SampleTest/createcon", true); 
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
    var messageText = escape(document.getElementById("i1").value); 
    document.getElementById("i1").value = ""; 
    xmlhttp.send("message="+messageText); 
} 

В onreadystatechange пожарах точно, когда ожидается, но xmlhttp.responseText всегда пусто.

Я знаю, что есть что-то известное как политика того же происхождения. Но я не понимаю, почему здесь проблема? Я запускаю все на localhost:8080.

Почему это все еще происходит и как я могу это решить?

+0

Что возвращает запрос в консоли? – Mouser

+0

@Mouser Какой запрос вы говорите? Не могли бы вы быть более конкретными относительно того, о чем вы говорите? – Heidi

+0

Я имею в виду ваш XmlHTTPRequest для '/ SampleTest/createcon' на сервере. Если вы посмотрите на вкладку в сети консоли в браузере, вы можете проверить, как был отправлен запрос и что он отправил обратно. – Mouser

ответ

0

Хорошо, решил. Думаю, это была моя собственная глупая ошибка. Метод startchat() должен быть изменен как-:

function startChat() { 
    var xmlhttp = new XMLHttpRequest(); 
     xmlhttp.open("GET", "/SampleTest/createcon", true); 
     xmlhttp.send(); 
     xmlhttp.onreadystatechange=function(){ 
      if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
      alert(xmlhttp.responseText); 
      } 
     } 
    } 

Поскольку я пытаюсь найти результат из запроса, сделанного в startChat().

Смежные вопросы