簡體   English   中英

我無法使用AJAX從servlet檢索responseText

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM