3 Stimmen

Servlet-Antwort auf AJAX-Anfrage ist leer

Ich sende eine AJAX-Anfrage mit Javascript an ein Servlet. Das Servlet antwortet tatsächlich, aber der Response-Header ist null und der Antworttext auch.

Wenn ich versuche, denselben Client-Code stattdessen die Anforderung an eine PHP-Seite zu senden, funktioniert es gut.

Hier sind die beiden Clients (Sie können sie ausprobieren und sich die Quellen ansehen):

Die Ausgabe beim Senden der Anfrage an das Servlet ist:

Response will go below

Response:

responseText was null!

Headers:

null response headers!

Die Ausgabe beim Senden der Anfrage an PHP ist:

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

Hier ist der Code für das Servlet. Wie Sie sehen können, experimentiere ich ein wenig mit den Einstellungen für Header und Inhaltstyp, aber keines meiner Experimente scheint irgendeine Wirkung zu haben. Das Seltsame ist, dass ich vor kurzem ein Hallo-Welt-Beispiel wie dieses mit Servlets gemacht habe, und es funktionierte ganz gut, ohne dass ich mit Headern und so etwas herumgespielt habe. Aber jetzt funktioniert es einfach nicht mehr :(

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 ist einfach:

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

Danke fürs Lesen und vielen Dank im Voraus!

Edit: Ich habe festgestellt, dass diese Links nicht ewig funktionieren werden. Daher füge ich zu Archivierungszwecken ajax-to-servlet.html hier ein. ajax-to-php.html ist bis auf die URL, an die die Anfrage geht, identisch. 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>

3voto

BalusC Punkte 1034465

Wenn Sie das Servlet aufrufen Eigenständig funktioniert es gut. Allerdings läuft das Servlet auf einem anderen Port als der, von dem die Ajax-Anfrage kommt. Dies verstößt gegen die Politik der gleichen Herkunft für Ajax-Anfragen und somit wird der Browser die Ajax-Antwort nicht verarbeiten. Abgesehen davon, dass Sie das Servlet hinter demselben Port hosten, müssen Sie JSONP oder setzen Sie die HTTP Access-Control Kopfzeilen.

Wenn Sie Folgendes zulassen möchten alle um das Servlet zu verwenden, setzen Sie den folgenden Header:

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

Die Informationen in den Antwort-Headern Ihrer Links deuten darauf hin, dass Sie Apache HTTPD und Apache Tomcat verwenden. Es ist gut zu wissen, dass Sie Apache HTTPD mit Apache Tomcat verbinden können, indem Sie Tomcat-Verbinder kann es sinnvoller sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X