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