【问题标题】:Stopping a Servlet from returning a Response阻止 Servlet 返回响应
【发布时间】:2013-07-18 18:27:33
【问题描述】:

浏览了 SO,找不到与我所追求的类似的问题。我将首先解释我想要做什么,然后以一个更具体的问题结束..

我的目标

我有一个将查询字符串参数传递给我的 servlet 的链接。该参数是report。如果report = true 在servlet 中,那么我将生成一个PDF 文档。然后 PDF 文档通过将响应的 mime type 设置为 application/pdf 来返回此值。这段代码如下所示:

        String mimeType = "application/pdf";
        res.setContentType(mimeType);
        res.setHeader("Content-Disposition", "attachment; filename=\"" +    
        getEventID(doc) + ".pdf\"");
        // Set the response content type and pdf attachment.

        out = new ByteArrayOutputStream();
        // All PDF Data is pushed onto the output stream.
        com.lowagie.text.Document pdfDoc = buildPDF(getEventID(doc));

然后将此代码写入response 对象的输出流。

        if(pdfDoc == null)
        {
            // Something went wrong in generating the report.
            return false;
        }
        // Create the PDF document.
        out.writeTo(res.getOutputStream());

如果一切顺利,该类返回true。如果不是,则返回false。现在,我遇到的问题是它是否返回 false。本质上,我想点空白阻止数据去任何地方。我添加了检查以确保一切顺利,之前我将任何内容写入输出流,所以目前我所拥有的是设置为 PDF 类型的响应,但不包含数据,如果出了点问题。

接下来,我有一个测试类输出的函数。如果是真的,那么一切都很好,但如果是假的,那么它会设置一个error参数:

 if(!PdfReportGenerator.generateReport(res, repositoryURI)) {
             req.getSession().setAttribute(SDRestServlet.PDF_ERROR, "error");
             // This will then re-direct back to the current URL, meaning the page
             // looks like it doesn't do anything.
             res.sendRedirect(req.getRequestURI());
 }

问题是,这种重定向真的没有任何帮助。它弄乱了存储在 request 中的其他值,虽然它使页面看起来好像什么也没做,但它不允许我向用户输出错误消息。

问题

虽然我知道如何让它看起来网络响应没有返回,但这意味着我无法向用户输出任何有意义的信息,这显然不是理想的结果。

我的问题

有没有办法强制 servlet 停止,或者返回一些东西让浏览器忽略数据?

我的第二个问题是,如果有什么我可以发送回浏览器,我可以在客户端做些什么来导致弹出消息(可以像alert() 一样简单)?

我已经尽可能的清楚了,所以如果你有什么需要知道的,尽管问:)

【问题讨论】:

  • 在您知道返回的是 PDF 还是错误之前,为什么还要将 mime 类型设置为 PDF?
  • 当我开始写这篇文章时,我真的不知道我在做什么,所以我只是从我在这个项目中看到的其他代码开始。我知道这不是最佳做法,但我们可以先专注于这个问题,然后我会根据您的改进建议采取行动吗?
  • 这不是一个改进建议。在我知道我返回的是 PDF 还是错误消息后,我会设置 mime-type。或者更确切地说,如果我重定向到错误页面,我根本不会设置 mime-type。
  • 同意,但我不想重定向到错误页面。我宁愿在客户端出现一条错误消息,而无需移动页面。
  • 那么你需要重新渲染原始页面并显示错误消息,或者使用ajax。

标签: java validation servlets error-handling response


【解决方案1】:

有没有办法强制 servlet 停止,或者返回一些东西 浏览器会忽略数据吗?

请尝试使用方法“ServletResponse.setContentLength(int)”设置零响应

我的第二个问题是,如果有什么我可以寄回给 浏览器,我可以在客户端做些什么来导致 要弹出的消息(可以像 alert() 一样简单)?

是的,您可以,但您需要更新回标头以说出“text/html”并设置所有变量,就像您在服务器请求的正常情况下所做的那样

第二种方法:

如果我必须从头开始构建它,请遵循以下方法:

  1. 先 make 和 AJAX 调用,看看是否需要生成 pdf
  2. 如果响应为假,则显示错误消息。
  3. 如果响应为真,则向服务器发送请求以生成 PDF

希望我能在这里帮到你一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多