对AJAX请求的Servlet响应为空
我正在使用JavaScript向servlet发送AJAX请求。该小服务程序确实在回复,但响应标题为空,响应文本也为空。对AJAX请求的Servlet响应为空
当我尝试相同的客户端代码,而不是发送请求到PHP页面,它工作正常。
这里有两个客户端(你可以尝试一下,看看他们的源):
- AJAX到的servlet:
http://79.136.61.27/web/ajax-to-servlet。 HTML - AJAX到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的代码。正如您所看到的,我正在试验一些设置标题和内容类型,但是我的任何实验都没有任何效果。奇怪的是,我做了一个hello world这样的例子,就像最近使用servlets一样,它工作得很好,没有搞乱头文件和东西。但现在它不再适用了。 :(
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。除了请求去的URL之外,ajax-to-php.html是相同的。 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>
如果你调用servlet standalone它工作正常。但是,servlet运行在不同于ajax请求来自的端口上。这违反了针对ajax请求的Same Origin Policy,因此浏览器不会处理ajax响应。除了在相同端口后托管小服务程序,您还需要返回JSONP或设置HTTP Access-Control
标头。
如果你想允许大家使用servlet,设置以下标题:
response.setHeader("Access-Control-Allow-Origin", "*");
响应标头中的信息,从您的联系表明,你正在运行的Apache httpd和Apache Tomcat上。很高兴知道您可以使用Tomcat Connector将Apache HTTPD连接到Apache Tomcat,它可能更有用。
非常感谢BalusC,你的分析确实是正确的。我使用Tomcat连接器工作。非常感谢! – 2011-04-18 19:57:40
这是我的荣幸,再次感谢! – 2011-04-18 23:50:40
不客气。 – BalusC 2011-04-19 01:09:51
你在运行你认为正在运行的servlet类吗? – BalusC 2011-04-17 12:25:23
感谢您的评论。是的,我可以看到它是如何调用的以及它如何响应代码中的更改,所以我发布的代码确实在执行。 – 2011-04-17 12:31:21