2011-04-25 60 views
1

我有一個名爲NewServlet.java的servlet文件。這個servlet被我的AJAX腳本調用來檢索響應。我無法從使用AJAX的servlet檢索responseText

我已通過在瀏覽器中測試來驗證該servlet。

但是,當我把它從我的AJAX腳本,它給了我,說

的XMLHttpRequest無法加載 http://localhost:8084/WebApplication1/NewServlet空白responseText和錯誤。 地空沒有被允許 訪問控制允許來源

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> 

能有人指出我在正確的方向?

謝謝。

+2

http://en.wikipedia.org/wiki/XMLHttpRequest#Cross-domain_requests是您遇到的問題。 – andyb 2011-04-25 18:02:06

+0

@andyb謝謝,這非常有幫助。 – Searock 2011-04-26 04:15:36

回答

4

這是在瀏覽器端...安全模型只允許AJAX請求到您從中獲取頁面的主機/端口。確保你已經通過服務器取得了你的頁面(例如http://localhost:8084/test.html),而不是通過文件系統加載它。那麼你應該很好地去......或者至少繼續調試。 ;)

+0

對不起,但是''通過文件系統加載它'是什麼意思?如何檢查我是否沒有通過文件系統加載它? – Searock 2011-04-25 17:35:24

+1

您的'test.html'頁面必須由與您正在進行AJAX調用的服務器在同一個域中的服務器提供服務。因此,只需將.html文件放在servlet容器中,而不是使用文件系統中的本地副本。 – andyb 2011-04-25 17:55:53

1

根據我的經驗,如果你想用ajax加載數據,請將你的請求發送到一個jsp文件,並從那個jsp文件中得到你的響應文本。漢德爾要容易得多。看看這個例子,如果你喜歡

EDITED < <

========================= = 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(」article「);」

,你可以添加<%進口頁=「」%>你的JSP頁面的頂部,例如:

<%@頁面進口=「導入JSP文件Java類com.omicc .classes.Article「%>

編寫處理響應的自己的load.jsp文件,然後在您的jsp文件中使用out.write寫入響應文本。

我希望它可以幫助你

+0

你能給我一個jsp例子嗎? – Searock 2011-04-26 04:13:08

+0

@searock:確定讓我編輯我的帖子 – MoienGK 2011-04-26 05:18:07

3

當servlet不同的端口超過了AJAX請求來自上運行,這的確可以發生。這違反了針對ajax請求的Same Origin Policy,因此瀏覽器不會處理ajax響應。除了將Servlet託管在同一端口之外,其他解決方案將返回JSONP,或者讓servlet設置標頭HTTP Access-Control

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

但是你需要記住,這樣你的servlet是阿賈克斯大家訪問。如果servlet返回敏感信息,那麼這是一個安全漏洞。但如果它不是,它應該是一個公衆 web服務,那麼它是安全的。

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