Java 对AJAX请求的Servlet响应为空
我正在使用javascript向servlet发送一个AJAX请求。servlet确实在应答,但是响应头和响应文本都是空的 当我尝试使用相同的客户端代码将请求发送到php页面时,效果很好 以下是两个客户端(您可以尝试它们并查看它们的来源):Java 对AJAX请求的Servlet响应为空,java,php,javascript,ajax,servlets,Java,Php,Javascript,Ajax,Servlets,我正在使用javascript向servlet发送一个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发送请求时的输出为:
- ajax到servlet: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
下面是servlet的代码。正如您所见,我正在尝试设置标题和内容类型,但我的实验似乎没有任何效果。奇怪的是,我最近使用servlet做了一个hello world示例,它工作得很好,没有弄乱标题和其他东西。但现在它已经不起作用了(
包装简单;
导入java.io.IOException;
导入java.io.PrintWriter;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
公共类SimpleServlet扩展了HttpServlet{
私有静态最终长SerialVersionId=-6713061702557291351L;
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
String out=“hifromservlet!”;
setContentType(“text/xml”);
setHeader(“缓存控制”、“无缓存”);
System.out.println(“获取请求”);
PrintWriter pw=response.getWriter();
写出来;
pw.flush();
布尔错误=pw.checkError();
System.out.println(“错误?”+错误);
}
}
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>
发送ajax
/* */
答复如下
如果调用servlet,它可以正常工作。但是,servlet运行的端口与ajax请求来自的端口不同。这违反了ajax请求的规则,因此浏览器不会处理ajax响应。除了在同一端口后托管servlet外,还需要返回或设置标头
如果要允许所有人使用servlet,请设置以下标题:
response.setHeader("Access-Control-Allow-Origin", "*");
链接的响应标题中的信息表明您正在运行Apache HTTPD和Apache Tomcat。很高兴知道您可以使用将Apache HTTPD连接到Apache Tomcat,这可能更有用。您是否正在运行您认为正在运行的servlet类?感谢您的评论。是的,我可以看到它是如何调用的,以及我是如何使用它的t响应代码中的更改,因此我发布的确实正在执行。非常感谢您,BalusC,您的分析确实是正确的。我使用Tomcat连接器使其正常工作。非常感谢!
response.setHeader("Access-Control-Allow-Origin", "*");