【问题标题】:Redirect to servlet fails重定向到 servlet 失败
【发布时间】:2011-02-01 21:56:59
【问题描述】:

我有一个名为 EditPhotos 的 servlet,信不信由你,它用于编辑与我正在开发的网页设计中的某个项目相关的照片。编辑照片的 URL 路径是 [[SITEROOT]]/EditPhotos/[[ITEMNAME]]

当您转到此路径 (GET) 时,页面加载正常。然后,您可以单击发布到同一页面的“删除”链接,告诉它删除照片。 servlet 正确接收到这个删除命令,并成功删除了照片。然后它将重定向发送回第一页 (GET)。

由于某种原因,此重定向失败。我不知道如何或为什么,但使用 Firefox 的 HTTPFox 插件,我看到 POST 请求收到 0 个字节作为响应,并且代码为 NS_BINDING_ABORTED。

我用于发送重定向的代码与我在整个网站中用于发送重定向的代码相同:

response.sendRedirect(Constants.SITE_ROOT + "EditPhotos/" + itemURL);

我检查了重定向发送的最终 URL,它肯定是正确的,但浏览器从未收到重定向。为什么?

【问题讨论】:

    标签: java javascript servlets redirect


    【解决方案1】:

    读取服务器日志。您是否在跟踪中看到 IllegalStateException: response already committedsendRedirect() 调用?

    如果是这样,则表示重定向失败,因为响应标头已发送。在致电sendRedirect() 之前,请确保您根本没有接触HttpServletResponse。重定向即基本上存在Location 响应标头,其中新URL 作为值。

    如果不是,那么您可能正在使用 JavaScript 处理请求,而 JavaScript 又无法处理新位置。

    如果两种情况都不是,或者您仍然无法理解,那么我们会对复制此问题的最小可能的“n”可粘贴代码 sn-p 感兴趣。然后更新您的问题以包含它。


    Update 根据 cmets,罪魁祸首确实是 JavaScript。 XMLHttpRequest POST 上的重定向不起作用。你是在使用自制的 XMLHttpRequest 函数还是像 jQuery 这样的围绕它的库?如果是 jQuery,请仔细阅读this question。归结为你需要返回一个特定的响应,然后让 JS/jQuery 自己做新的window.location

    【讨论】:

    • 在日志中根本找不到 IllegalStateException 或任何异常。 POST 本身是通过 JavaScript 发送的,这可能是问题所在吗?我会尝试找到问题的简短 sn-p。
    • 糟糕,暂时忘记刷新页面了。我设法通过更改 JavaScript 来修复它,我已经在下面发布了。
    【解决方案2】:

    原来是我用来发送 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();
    }
    

    【讨论】:

    • 并不意味着苛刻,但那些 JavaScript 总是让我发痒。为什么不只是一个带有按钮的表单?如有必要,您可以使用 CSS 将按钮设置为看起来像普通链接。
    • 说实话,我不知道究竟是为什么,但我认为当时我发现这样做更整洁。拥有许多小表单并尝试使它们的样式和布局正确会给我 CSSeadaches。
    • 网站应该在禁用 JS 的情况下同样运行(手机!)。 JS 应该只做渐进式增强。一旦你理解了 CSS,它就非常简单了。
    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    相关资源
    最近更新 更多