2016-01-06 13 views
0

我使用AJAX異步填充列表。在加載網頁之後,觸發一個AJAX請求填充列表框。但是,當我將此請求發送到服務器時,將返回一個意外的網頁(列表框存在),而不是列表數據(JSON)。AJAX,send()似乎被無意中重定向

[成分]
haveList.jsp =有列表框。它包括<script src="loadData.js">標籤。
loadData.js =它生成一個Ajax請求併發送給服務器。加載後haveList.jsploadData.js將被調用。 (我只是檢查請求,利用警報從服務器上獲取正確的數據。) returnPage.java =的Servlet轉發到haveList.jsp
returnJsonData.java = Servlet的返回JSON字符串loadData.js要求。
其中每一個如下所示。

[web.xml中]

<servlet> 
<servlet-name>ReturnPage</servlet-name> 
<servlet-class>pkg.ReturnPage</servlet-class>  
</servlet> 
<servlet-mapping> 
<servlet-name>ReturnPage</servlet-name> 
<url-pattern>/openHaveList.do</url-pattern> 
</servlet-mapping> 
<servlet> 
<servlet-name>DataManager</servlet-name> 
<servlet-class>pkg.ReturnJsonData</servlet-class>  
</servlet> 
<servlet-mapping> 
<servlet-name>DataManager</servlet-name> 
<url-pattern>/requestListData.do</url-pattern> 
</servlet-mapping> 

[現象]
我發送 「openHaveList.do」 到服務器。
返回頁面「haveList」。
立即發生AJAX請求以獲取JSON數據。 (requestListData.do)(請參閱以下loadData.js)
使用alert()我檢查的responseText內容從服務器
我預計JSON數據,但haveList.jsp的HTML在那裏。

[線索]
(1)當我從服務器得到了意想不到的HTML,瀏覽器的地址欄中顯示http://localhost/openHaveList.do (在其他頁面,我點擊圖像,然後openHaveList.do發生。)
(2)我使用ZAP(Zed Attack Proxy)捕獲了請求/響應,我看到發生了請求。
第一:requestListData.do(響應:空)
第二:openHaveList.do。 (迴應:hasList.jsp的html)
因此,我懷疑AJAX請求是無意中重定向的。 (requestListData.do - > openHaveList.do)

- 源代碼 -
[haveList.jsp]
沒有什麼特別的。有列表框中

[loadData.js]

(function() { 
var conn=null, addEvent=null, createXHR=null, loadNations = null, setAsyncLoad=null; 
addEvent = (function(window){ 
if(window.addEventListener){ 
    return function (element, eventName, callback, canCapture) { 
    element.addEventListener(eventName, callback, canCapture); 
}; 
    } else if(window.attachEvent){ 
return function (element, eventName, callback) { 
element.attachEvent("on" + eventName, callback); 
}; 
} else { 
return function (element, eventName, callback) { 
    element["on" + eventName] = callback; 
    } 
} 
}(window)); 
createXHR = function() { 
var xhrObj = null; 
    try{ 
    xhrObj = new XMLHttpRequest(); 
    } catch (exception){ 
    try{ 
    xhrObj = new ActiveXObject('Msxml2.XMLHTTP'); 
} catch (innerException){ 
    xhrObj = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
} 
return xhrObj; 
}; 
    loadAsync = function() { 
var list = document.getElementById("list"); 
    conn = createXHR(); 
    conn.onreadystatechange = function() { 
    if(conn.readyState == 4){ 
    if(conn.status == 200){ 
     alert(conn.responseText); //--> Here it shows the html of haveList.jsp 
    } 
    } 
}; 
conn.open('GET', 'requestListData.do'); 
conn.send(); 
}; 
addEvent(window, 'load', function() { loadAsync(); } , false); 
}()); 

[returnPage。的java]

public class ReturnPage extends HttpServlet { 
private static String page = "/haveList.jsp"; 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
RequestDispatcher dispatcher = request.getRequestDispatcher(page); 
response.setHeader("Pragma", "No-cache"); 
response.setHeader("Cache-Control", "no-cache"); 
response.addHeader("Cache-Control", "no-store"); 
response.setDateHeader("Expires", 1L); 
dispatcher.forward(request, response); 
} 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
RequestDispatcher dispatcher = request.getRequestDispatcher(page); 
response.setHeader("Pragma", "No-cache"); 
response.setHeader("Cache-Control", "no-cache"); 
response.addHeader("Cache-Control", "no-store"); 
response.setDateHeader("Expires", 1L); 
dispatcher.forward(request, response); 
} 
} 

[returnJsonData.java]

public class ReturnJsonData extends HttpServlet { 
private String command = null; 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
strUri = request.getRequestURI(); 
command = strUri.substring(request.getContextPath().length()); 
try { 
    response.setHeader("Pragma", "No-cache"); 
    response.setHeader("Cache-Control", "no-cache"); 
    response.addHeader("Cache-Control", "no-store"); 
    response.setDateHeader("Expires", 1L); 
    response.setContentType("application/json; charset=UTF-8"); 
    response.getWriter().print(loadListData(request, command)); 
} catch (Throwable e) { 
    System.out.println("Failed to load list"); 
} 
} 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
strUri = request.getRequestURI(); 
command = strUri.substring(request.getContextPath().length()); 
try { 
    response.setHeader("Pragma", "No-cache"); 
    response.setHeader("Cache-Control", "no-cache"); 
    response.addHeader("Cache-Control", "no-store"); 
    response.setDateHeader("Expires", 1L); 
    response.setContentType("application/json; charset=UTF-8"); 
    response.getWriter().print(loadListData(request, command)); 
} catch (Throwable e) { 
    System.out.println("Failed to load list"); 
} 
} 
private String loadListData(HttpServletRequest request, String command) throws Throwable 
{ 
String codeList = null; 
if("/requestListData.do".equals(command)){ 
    codeList = codeDao.select(conn); 
} 
} 
} 

回答

0

我解決它! ^^

[原因]
因爲我過濾的。

[詳細]
其實,haveList.jsp登錄頁面。我有一個篩選器,用於檢查請求是否已登錄。如果不是,則該篩選器將請求重定向到「haveList.jsp(登錄頁面)」
當ajax調用服務器(requestListData.do)被觸發時,將重定向請求過濾爲登錄頁面,因爲它未登錄。請參閱以下web.xml(之前)。

<filter> 
<filter-name>Checker</filter-name> 
<filter-class>filter.Checker</filter-class> 
<init-param> 
<param-name>escape</param-name> 
<param-value>/Test/,/Test/gate.jsp,/Test/openHaveList.do</param-value> 
</init-param> 
</filter> 
<filter-mapping> 
<filter-name>Checker</filter-name> 
<url-pattern>*.do</url-pattern> 
</filter-mapping> 
<filter-mapping> 
<filter-name>Checker</filter-name> 
<url-pattern>*.jsp</url-pattern>  
</filter-mapping> 

[解決方法]
我註冊到服務器作爲例外Ajax調用。 (escape參數)在我的過濾器 servlet中,我沒有將這樣的異常重定向到登錄頁面以編程方式。參考以下web.xml(之後)。

<filter> 
<filter-name>Checker</filter-name> 
<filter-class>filter.Checker</filter-class> 
<init-param> 
<param-name>escape</param-name> 
<param-value>/Test/,/Test/gate.jsp,/Test/openHaveList.do,"/requestListData.do"</param-value> 
</init-param> 
</filter> 
<filter-mapping> 
<filter-name>Checker</filter-name> 
<url-pattern>*.do</url-pattern> 
</filter-mapping> 
<filter-mapping> 
<filter-name>Checker</filter-name> 
<url-pattern>*.jsp</url-pattern>  
</filter-mapping> 

在此之後,我從服務器得到JSON數據。 ^^