【问题标题】:I can't retrieve responseText from servlet using AJAX我无法使用 AJAX 从 servlet 中检索 responseText
【发布时间】:2011-04-25 17:24:04
【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

标签: java javascript ajax servlets


【解决方案1】:

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

【讨论】:

  • 对不起,loaded it via the filesystem 是什么意思?如何检查我是否没有通过文件系统加载它?
  • 您的 test.html 页面必须由与您进行 AJAX 调用的服务器位于同一域的服务器提供服务。因此,只需将 .html 文件放在您的 servlet 容器中,而不是使用文件系统中的本地副本。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    根据我的经验,如果您想使用 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
        }
    }
    

    ============================ 加载.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("article");"

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

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

    希望对你有帮助

    【讨论】:

    • 你能给我一个jsp的例子吗?
    【解决方案4】:
    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();
    

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 2013-07-02
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多