Ответ сервлета на запрос AJAX пуст - PullRequest
3 голосов
/ 17 апреля 2011

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

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

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

  • ajax-to-servlet: http://79.136.61.27/web/ajax-to-servlet.html
  • ajax-to-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

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

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>

1 Ответ

3 голосов
/ 17 апреля 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...