我有一个名为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>
有人可以指出我正确的方向吗?
感谢。
答案 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();