[英]I can't retrieve responseText from servlet using AJAX
我有一個名為NewServlet.java
的servlet文件。 我的AJAX腳本調用了該servlet來檢索響應。
我已經通過在瀏覽器中對其進行測試來驗證了該servlet。
但是,當我從AJAX腳本中調用它時,它給了我一個空白的responseText
和一個錯誤,內容為
XMLHttpRequest無法加載http:// localhost:8084 / WebApplication1 / NewServlet 。 Access-Control-Allow-Origin不允許使用原點null
NewServlet.java
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class NewServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<option value='1'>one</option>");
out.println("<option value='2'>two</option>");
out.println("<option value='3'>three</option>");
out.println("<option value='4'>four</option>");
out.println("<option value='5'>five</option>");
out.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
public String getServletInfo() {
return "Short description";
}
}
test.html
<html>
<head>
<script language = "javascript">
var xmlDoc = 0;
var xhttp = 0;
function reciveData()
{
if (window.XMLHttpRequest)
{
xhttp=new XMLHttpRequest();
}
else // IE 5/6
{
xhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xhttp.onreadystatechange = redirectUser;
xhttp.open("GET","http://localhost:8084/WebApplication1/NewServlet",true);
xhttp.send();
}
function redirectUser()
{
if (xhttp.readyState == 4)
{
log = 0;
xmlDoc = xhttp.responseText;
alert(xmlDoc);
}
}
</script>
</head>
<body onload="reciveData()">
</body>
</html>
有人能指出我正確的方向嗎?
謝謝。
那是在瀏覽器端...安全模型僅允許AJAX請求到您從中獲取頁面的同一主機/端口。 確保已通過服務器(例如http:// localhost:8084 / test.html )獲取了頁面,並且未通過文件系統加載頁面。 然后,您應該可以進行...或至少繼續調試。 ;)
當servlet在與ajax請求所來自的端口不同的端口上運行時,確實會發生這種情況。 這違反了針對ajax請求的“ 相同來源策略 ”,因此瀏覽器將不會處理ajax響應。 除了將Servlet托管在同一端口后面之外,其他解決方案還包括返回JSONP或讓Servlet設置HTTP Access-Control
標頭。
response.setHeader("Access-Control-Allow-Origin", "*");
但是,您需要記住,這樣, 每個人都可以通過Ajax訪問您的servlet。 如果servlet返回敏感信息,則這是一個安全漏洞。 但是,如果沒有,並且應該是公共 Web服務,那么它是安全的。
This will solve your issue..
// Ajax response
res.setContentType("text/javascript");
res.setCharacterEncoding("UTF-8");
res.setHeader("Cache-Control", "no-cache");
PrintWriter out = res.getWriter();
out.print("GRANTED");
out.close();
以我的經驗,如果要使用ajax加載數據,請將請求發送到jsp文件,然后從該jsp文件獲取響應文本。 這很容易處理。 如果您喜歡,請參見此示例
編輯<<
========================= ajax_load.js:
var xmlhttp;
function loadAdminRight(category){
xmlhttp = GetXmlHttpObject();
if (xmlhttp == null) {
alert("Your browser does not support Ajax HTTP");
return;
}
var url = "load.jsp";
url = url + "?category="+category;
xmlhttp.onreadystatechange = getLoad;
xmlhttp.open("GET", url, true);
xmlhttp.send(null);
}
function getLoad(){
if (xmlhttp.readyState == 4) {
document.getElementById("right_content").innerHTML = xmlhttp.responseText;
//or what you want to do
}
}
========================== load.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String l_category = request.getParameter("category");
if(l_category.equals("article")){
out.write("You have choosen article category");
out.write("<br/>");
}
}else if(l_category.equals("news")){
out.write("You have choosen article category");
out.write("<br/>");
}
%>
並使ajax運行下去,您只需要從所需的位置調用.js函數即可,例如在按鈕click動作上:onClick =“ loadAdminRight(” article“);”
並且您可以在jsp文件中導入Java類,方法是在jsp頁面頂部添加<%page import =“”%>,例如:
<%@ page import =“ com.omicc.classes.Article”%>
編寫自己的用於處理響應的load.jsp文件,然后在jsp文件中使用out.write編寫響應文本。
我希望它可以幫助您
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.