【问题标题】:Servlet response to AJAX request is emptyServlet 对 AJAX 请求的响应为空
【发布时间】:2011-08-07 07:10:39
【问题描述】:

我正在使用 javascript 向 servlet 发送 AJAX 请求。 servlet 确实在回复,但响应标头为空,响应文本也是如此。

当我尝试使用相同的客户端代码将请求发送到 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

向servlet发送请求时的输出是:

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

这是 servlet 的代码。如您所见,我正在尝试设置标题和内容类型,但我的实验似乎都没有任何效果。奇怪的是,我最近使用 servlet 做了一个像这样的 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 到 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>

【问题讨论】:

  • 您是否正在运行您认为正在运行的 servlet 类?
  • 感谢您的评论。是的,我可以看到它是如何被调用的,以及它如何响应代码的变化,所以我发布的确实是在执行。

标签: java php javascript ajax servlets


【解决方案1】:

如果您调用 servlet standalone 它工作正常。但是,servlet 在与 ajax 请求的来源不同的端口上运行。这违反了 ajax 请求的Same Origin Policy,因此浏览器不会处理 ajax 响应。除了将 servlet 托管在同一端口之后,您还需要返回 JSONP 或设置 HTTP Access-Control 标头。

如果您想允许每个人 使用 servlet,请设置以下标头:

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

链接的响应标头中的信息表明您正在运行 Apache HTTPD 和 Apache Tomcat。很高兴知道您可以使用Tomcat Connector 将 Apache HTTPD 连接到 Apache Tomcat,它可能会更有用。

【讨论】:

  • 非常感谢BalusC,您的分析确实是正确的。我使用 Tomcat 连接器使它工作。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
相关资源
最近更新 更多