我有一个名为 EditPhotos 的servlet,不管你信不信,它用于编辑与我正在开发的网页设计中某个项目相关的照片。编辑照片的URL路径是 [[SITEROOT]] / EditPhotos / [[ITEMNAME]] 。
当您转到此路径(GET)时,页面加载正常。然后,您可以点击发布到同一页面的“删除”链接,告诉它删除照片。 servlet正确接收此删除命令并成功删除照片。然后它将重定向发送回第一页(GET)。
由于某种原因,此重定向失败。我不知道怎么或为什么,但是使用firefox的HTTPFox插件,我看到POST请求在响应中收到0个字节,并且代码为NS_BINDING_ABORTED。
我用来发送重定向的代码与我在整个网站上用来发送重定向的代码相同:
response.sendRedirect(Constants.SITE_ROOT + "EditPhotos/" + itemURL);
我已经检查了重定向发送的最终URL,这肯定是正确的,但浏览器从未收到重定向。为什么呢?
答案 0 :(得分:1)
阅读服务器日志。您是否在跟踪中看到IllegalStateException: response already committed
调用了sendRedirect()
?
如果是这样,那么这意味着重定向失败,因为已经发送了响应头。在致电HttpServletResponse
之前,请确保您没有触碰sendRedirect()
。重定向即存在基本上Location
响应头,新URL作为值。
如果没有,那么您可能正在使用JavaScript处理请求,而JavaScript又无法处理新位置。
如果情况不是这样,或者你仍然无法理解,那么我们会对最小的copy'n'密码代码片段产生兴趣,它会再现这个问题。然后更新您的问题以包含它。
更新根据评论,罪魁祸首确实是在JavaScript中。 XMLHttpRequest POST上的重定向不起作用。您是否正在使用自行开发的XMLHttpRequest
函数或其周围的库,如jQuery?如果是jQuery,请仔细阅读this question。归结为你需要返回一个特定的响应然后让JS / jQuery自己做新的window.location
。
答案 1 :(得分:0)
事实证明,这是我用来发送问题的POST的JavaScript。 我最初有这个:
<a href="#" onClick="javascript:deletePhoto(781)">Delete</a>
当我改变它时,一切都得到了修复:
<a href="#" onClick="javascript:deletePhoto(781); return false;">Delete</a>
deletePhoto功能是:
function deletePhoto(photoID) {
doPost(document.URL, {'action':'delete', 'id':photoID});
}
function doPost(path, params) {
var form = document.createElement("form");
form.setAttribute("method", "POST");
form.setAttribute("action", path);
for(var key in params) {
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", key);
hiddenField.setAttribute("value", params[key]);
form.appendChild(hiddenField);
}
document.body.appendChild(form);
form.submit();
}