Java 我能';t使用AJAX从servlet检索responseText

Java 我能';t使用AJAX从servlet检索responseText,java,javascript,ajax,servlets,Java,Javascript,Ajax,Servlets,我有一个名为NewServlet.java的servlet文件。我的AJAX脚本调用这个servlet来检索响应 我通过在浏览器中测试servlet来验证它 但是,当我从AJAX脚本调用它时,它会给我一个空白的responseText和一个错误 无法加载XMLHttpRequest . 不允许原点为null 访问控制允许源 NewServlet.java import java.io.*; import java.net.*; import javax.servlet.*; import ja

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

我通过在浏览器中测试servlet来验证它

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

无法加载XMLHttpRequest . 不允许原点为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";
    }

}
import java.io.*;
导入java.net。*;
导入javax.servlet.*;
导入javax.servlet.http.*;
公共类NewServlet扩展了HttpServlet{
受保护的void processRequest(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
response.setContentType(“text/html”);
PrintWriter out=response.getWriter();
out.println(“一”);
out.println(“两个”);
out.println(“三”);
out.println(“四”);
out.println(“五”);
out.close();
}
受保护的void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
processRequest(请求、响应);
}
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
processRequest(请求、响应);
}
公共字符串getServletInfo(){
返回“简短描述”;
}
}
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>

var xmlDoc=0;
var xhttp=0;
函数reciveData()
{
if(window.XMLHttpRequest)
{
xhttp=newXMLHttpRequest();
}
其他//IE 5/6
{
xhttp=新的ActiveXObject(“Microsoft.XMLHTTP”);
}
xhttp.onreadystatechange=重定向用户;
xhttp.open(“GET”http://localhost:8084/WebApplication1/NewServlet“,对);
xhttp.send();
}
函数重定向用户()
{
if(xhttp.readyState==4)
{
log=0;
xmlDoc=xhttp.responseText;
警报(xmlDoc);
}
}
有人能给我指出一个正确的方向吗


谢谢。

这是在浏览器端…安全模型只允许AJAX请求到您从中获取页面的同一主机/端口。确保您已通过服务器(例如)获取页面,而不是通过文件系统加载页面。那么你应该准备好去……或者至少继续调试。;)

在浏览器端……安全模型只允许对从中获取页面的同一主机/端口发出AJAX请求。确保您已通过服务器(例如)获取页面,而不是通过文件系统加载页面。那么你应该准备好去……或者至少继续调试。;)

根据我的经验,如果希望使用ajax加载数据,请将请求发送到jsp文件,并从该jsp文件中获取响应文本。汉德尔要容易得多。如果您愿意,请参见此示例

编辑

要使ajax继续运行,您只需在需要的位置调用.js函数,例如在按钮单击操作上: onClick=“loadAdminRight(“文章”)

您可以将java类导入到jsp文件中,并在jsp页面顶部添加,例如:

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


我希望它能帮助您

根据我的经验,如果您希望使用ajax加载数据,将请求发送到jsp文件,并从该jsp文件获取响应文本。汉德尔要容易得多。如果您愿意,请参见此示例

编辑

要使ajax继续运行,您只需在需要的位置调用.js函数,例如在按钮单击操作上: onClick=“loadAdminRight(“文章”)

您可以将java类导入到jsp文件中,并在jsp页面顶部添加,例如:

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


我希望它能帮助您

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

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

但是,您需要记住,通过这种方式,每个人都可以通过Ajax访问servlet。如果servlet返回敏感信息,则这是一个安全漏洞。但是,如果它不是,并且它应该是一个公共Web服务,那么它是安全的。

当servlet
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();
response.setHeader("Access-Control-Allow-Origin", "*");
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();