Я отправляю запрос AJAX, используя javascript для сервлета. Сервлет действительно отвечает, но заголовок ответа имеет значение NULL, а также текст ответа.
Когда я пытаюсь использовать один и тот же клиентский код, вместо этого отправляю запрос на php-страницу, он отлично работает.
Вот два клиента (вы можете попробовать их и посмотреть на их источники):
Вывод при отправке запроса на сервлет:
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
Вот код для сервлета. Как вы можете видеть, я немного экспериментирую с заголовками настроек и типом контента, но ни один из моих экспериментов не имеет никакого эффекта. Странно, что я сделал этот пример 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>"; ?>
Спасибо за прочтение и спасибо заранее!
Edit: Я понял, что эти ссылки не будут работать вечно. Итак, для целей архива я вставляю ajax-to-servlet.html здесь. ajax-to-php.html идентичен, кроме URL-адреса, куда идет запрос. Аякса к 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. Это нарушает политику одного и того же происхождения для запросов ajax и, следовательно, браузер не будет обрабатывать ответ ajax. Помимо размещения сервлета за одним и тем же портом, вам нужно вернуть JSONP или установить заголовки HTTP Access-Control
.
Если вы хотите разрешить всем использовать сервлет, установите следующий заголовок:
response.setHeader("Access-Control-Allow-Origin", "*");
Информация в заголовках ответов из ваших ссылок предполагает, что вы используете Apache HTTPD и Apache Tomcat. Хорошо знать, что вы можете подключить Apache HTTPD к Apache Tomcat с помощью Tomcat Connector , это может быть более полезно.