我使用AJAX異步填充列表。在加載網頁之後,觸發一個AJAX請求填充列表框。但是,當我將此請求發送到服務器時,將返回一個意外的網頁(列表框存在),而不是列表數據(JSON)。AJAX,send()似乎被無意中重定向
[成分]
haveList.jsp =有列表框。它包括<script src="loadData.js">
標籤。
loadData.js =它生成一個Ajax請求併發送給服務器。加載後haveList.jsp
,loadData.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);
}
}
}