Ответ сервлета на запрос AJAX пуст


Я отправляю AJAX-запрос с помощью javascript сервлету. Сервлет действительно отвечает, но заголовок ответа равен нулю, как и текст ответа.

Когда я пытаюсь использовать тот же клиентский код, чтобы вместо этого отправить запрос на страницу php, он работает нормально.

Вот два клиента (вы можете попробовать их и посмотреть на их источники):

  • ajax-к-сервлету: http://79.136.61.27/web/ajax-to-servlet.html
  • ajax-в-php: http://79.136.61.27/web/ajax-to-php.html

Вывод при отправке запроса сервлету:

Response will go below

Response:

responseText was null!

Headers:

null response headers!

Вывод при отправке запроса на PHP:

Response will go below

Response:

Hi from php

Headers:

Date: Sun, 17 Apr 2011 11:58:57 GMT Server: Apache/2.2.17 (Win32) PHP/5.3.6 X-Powered-By: PHP/5.3.6 Content-Length: 18 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html

Вот код для сервлета. Как вы можете видеть, я немного экспериментирую с заголовками настроек и типом контента, но ни один из моих экспериментов, похоже, не дал никакого эффекта. Странно то, что я совсем недавно сделал такой пример с hello world, используя сервлеты, и он отлично работал без возился с заголовками и прочим. Но теперь это просто больше не работает. :(

package simple;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class SimpleServlet extends HttpServlet {

    private static final long serialVersionUID = -6713061702557291351L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String out = "<p>Hi from servlet!</p>";

        response.setContentType("text/xml");
        response.setHeader("Cache-Control", "no-cache");
        System.out.println("got request");

        PrintWriter pw = response.getWriter();

        pw.write(out);
        pw.flush();
        boolean error = pw.checkError();
        System.out.println("Error? " + error);  
    }
}

Hifromphp.php это просто:

<?php
    echo "<p>Hi from php</p>";
?>

Спасибо за чтение и заранее благодарю!

Редактировать: Я понял, что эти ссылки не будут работать вечно. Итак, для архивных целей я вставляю ajax-to-servlet.html здесь. ajax-to-php.html идентичен, за исключением URL-адреса, по которому отправляется запрос. ajax-to-html.html :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
                    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Send ajax</title>
  </head>
  <body>
    <script type="text/javascript">
            /* <![CDATA[ */
            function getXMLHttp() {
                var xmlHttp = new XMLHttpRequest();

                return xmlHttp;
            }

            function sendAjax() {
                var xmlHttp = getXMLHttp();
                var divResp = document.getElementById("response");
                var divHdrs = document.getElementById("responseHeaders");

                xmlHttp.onreadystatechange = function() {
                    if (xmlHttp.readyState == 4) {
                        var hdrs = xmlHttp.getAllResponseHeaders();
                        var resp = xmlHttp.responseText;

                        divHdrs.innerHTML = "<p>Headers:</p><p>" + (hdrs ? hdrs : "null response headers!<p>");
                        divResp.innerHTML = "<p>Response:</p>" + (resp ? resp : "<p>responseText was null!<p>");
                    }
                }       

                xmlHttp.open("GET", "http://79.136.61.27:8080/SimpleServlet/SimpleServlet", true);
                xmlHttp.send(null);
            }
            /* ]]> */
        </script>
    <p><input type="button" value="Send Ajax" onclick="javascript: sendAjax();"/></p>
    <p>Response will go below</p>
    <div id="response"></div>
    <div id="responseHeaders"></div>
  </body>
</html>
Author: RustyTheBoyRobot, 2011-04-17

1 answers

Если вы вызываете сервлет автономный, он работает нормально. Однако сервлет работает на другом порту, чем тот, откуда поступает запрос ajax. Это нарушает Ту же политику происхождения для запросов ajax, и поэтому браузер не будет обрабатывать ответ ajax. Помимо размещения сервлета за тем же портом, вам необходимо вернуть JSONP или установить HTTP Access-Control заголовки.

Если вы хотите разрешить всем использовать сервлет, установите следующий заголовок:

response.setHeader("Access-Control-Allow-Origin", "*");

Информация в заголовках ответов по вашим ссылкам предполагает, что вы используете Apache HTTPD и Apache Tomcat. Приятно знать, что вы можете подключить Apache HTTPD к Apache Tomcat с помощью Соединителя Tomcat, это может быть более полезным.

 3
Author: BalusC, 2011-04-18 23:27:44