我无法使用AJAX从servlet检索responseText

时间:2011-04-25 17:24:04

标签: java javascript ajax servlets

我有一个名为NewServlet.java的servlet文件。我的AJAX脚本调用此servlet来检索响应。

我已经通过在浏览器中测试来验证servlet。

但是当我从我的AJAX脚本中调用它时,它会给我一个空白的responseText并显示错误

  

XMLHttpRequest无法加载   http://localhost:8084/WebApplication1/NewServlet。   原则为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>

有人可以指出我正确的方向吗?

感谢。

4 个答案:

答案 0 :(得分:4)

这是在浏览器端...安全模型只允许AJAX请求到您从中获取页面的同一主机/端口。确保您已通过服务器(例如http://localhost:8084/test.html)获取了页面,而未通过文件系统加载页面。然后你应该好好去......或者至少继续调试。 ;)

答案 1 :(得分:3)

当servlet在与ajax请求来源不同的端口上运行时,确实会发生这种情况。这违反了Same Origin Policy的ajax请求,因此浏览器不会处理ajax响应。除了在同一端口后面托管servlet之外,其他解决方案是返回JSONP或者让servlet设置HTTP Access-Control标头。

response.setHeader("Access-Control-Allow-Origin", "*");

然而,您需要记住,通过Ajax可以访问每个人,这样您的servlet就可以了。如果servlet返回敏感信息,那么这是一个安全漏洞。但如果它没有,它应该是公共网络服务,那么它是安全的。

答案 2 :(得分:1)

根据我的经验,如果您想使用ajax加载数据,请将您的请求发送到jsp文件,并从该jsp文件中获取您的响应文本。汉德尔要容易得多。如果你愿意,请看这个例子

  
    

EDITED&LT;&LT;

  

========================== 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函数,例如在按钮点击动作上: 的onClick = “loadAdminRight(” 物品 “);”

您可以在jsp文件中导入java类,并添加&lt;%page import =“”%&gt;到jsp页面的顶部,例如:

&lt;%@ page import =“com.omicc.classes.Article”%&gt;

编写自己的load.jsp文件来处理响应,然后在jsp文件中使用out.write来编写响应文本。

我希望它可以帮助你

答案 3 :(得分:1)

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();