Servlets 如果我';我愿意关闭连接吗?

Servlets 如果我';我愿意关闭连接吗?,servlets,Servlets,(见相关问题:) 在我的例子中#1要求浏览器显示错误消息。无论多么缺乏信息 关闭ServletResponse输出流显然不起作用。即使我没有先关闭(在Tomcat6.0.16上测试),也不会抛出异常。我想我想要的是一个RST包,一个块中的FIN,或者格式不好的块头。 之后,我可以担心各种浏览器的响应 编辑澄清:这是为了文件下载,可能是几GB的二进制数据。在我开始发送部分数据之前,我无法确保所有数据都能被成功读取或解密。我认为你的做法是错误的。在确定是否成功或失败之前,不开始发送数据似乎更简单。这

(见相关问题:)

在我的例子中#1要求浏览器显示错误消息。无论多么缺乏信息

关闭ServletResponse输出流显然不起作用。即使我没有先关闭(在Tomcat6.0.16上测试),也不会抛出异常。我想我想要的是一个RST包,一个块中的FIN,或者格式不好的块头。 之后,我可以担心各种浏览器的响应


编辑澄清:这是为了文件下载,可能是几GB的二进制数据。在我开始发送部分数据之前,我无法确保所有数据都能被成功读取或解密。

我认为你的做法是错误的。在确定是否成功或失败之前,不开始发送数据似乎更简单。这样,如果需要,您可以在开始时发送错误消息,而不是发送无效的部分数据

如果你真的必须这样做,你也许可以用JavaScript解决一些问题。出现错误时,请在关闭连接之前输出如下内容:

<script type="text/javascript"> alert("Processing failed!"); </script>
警报(“处理失败!”);

您可能希望在脚本上展开,但您已经了解了总体思路。这是假设发送回浏览器的是一个HTML页面,您在问题中没有指定它。

我认为您的做法是错误的。在确定是否成功或失败之前,不开始发送数据似乎更简单。这样,如果需要,您可以在开始时发送错误消息,而不是发送无效的部分数据

如果你真的必须这样做,你也许可以用JavaScript解决一些问题。出现错误时,请在关闭连接之前输出如下内容:

<script type="text/javascript"> alert("Processing failed!"); </script>
警报(“处理失败!”);

您可能希望在脚本上展开,但您已经了解了总体思路。这是假设发送回浏览器的是一个HTML页面,您没有在问题中指定它。

我自己的答案,经过研究

第一部分:似乎没有办法让应用服务器相信,我在“提交”阶段测试了一个错误。以下Servlet代码在套接字上生成合法的HTTP分块传输头。有趣的是,在WebSphere的情况下,在结束标记之前,错误消息被附加到流的末尾

public class Servlet extends HttpServlet {
    public static final int ARRAY_SIZE = 65536;
    private static final int SEND_COUNT = 100000;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {

        String testData = "This is a fairly long piece of test text, running on and on and on, over and over.";

        final ServletOutputStream outputStream = response.getOutputStream();
        for (int i = 0; i < SEND_COUNT; ++i) {
            outputStream.println(testData);
        }
        throw new ServletException("Break it now");
    }
}
public类Servlet扩展了HttpServlet{
公共静态最终整数数组_SIZE=65536;
私有静态最终int发送计数=100000;
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,java.io.IOException{
String testData=“这是一段相当长的测试文本,一次又一次地运行。”;
final ServletOutputStream outputStream=response.getOutputStream();
对于(int i=0;i

第二部分:即使应用程序服务器愿意在不关闭零长度块的情况下将虚假数据写入线路或关闭套接字,普通客户端也不会报告错误。IE7、FF3和cURL不报告区块编码中的错误。这使得HTTP下载本身就不可靠,如果不是HTTP 1.1 RFC的文字,也与此背道而驰。

我自己的答案,经过研究

第一部分:似乎没有办法让应用服务器相信,我在“提交”阶段测试了一个错误。以下Servlet代码在套接字上生成合法的HTTP分块传输头。有趣的是,在WebSphere的情况下,在结束标记之前,错误消息被附加到流的末尾

public class Servlet extends HttpServlet {
    public static final int ARRAY_SIZE = 65536;
    private static final int SEND_COUNT = 100000;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {

        String testData = "This is a fairly long piece of test text, running on and on and on, over and over.";

        final ServletOutputStream outputStream = response.getOutputStream();
        for (int i = 0; i < SEND_COUNT; ++i) {
            outputStream.println(testData);
        }
        throw new ServletException("Break it now");
    }
}
public类Servlet扩展了HttpServlet{
公共静态最终整数数组_SIZE=65536;
私有静态最终int发送计数=100000;
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,java.io.IOException{
String testData=“这是一段相当长的测试文本,一次又一次地运行。”;
final ServletOutputStream outputStream=response.getOutputStream();
对于(int i=0;i

第二部分:即使应用程序服务器愿意在不关闭零长度块的情况下将虚假数据写入线路或关闭套接字,普通客户端也不会报告错误。IE7、FF3和cURL不报告区块编码中的错误。这使得HTTP下载本身就不可靠,如果不是HTTP 1.1 RFC的文字,也违背了其精神。

servlet API不允许这样做。提交响应后,响应代码已发送。最好关闭连接并记录错误。

servlet API不允许这样做。提交响应后,响应代码已发送。您最好关闭连接并记录错误。

引文?当我的Servlet在提交点之后抛出一些GenericError时,Servlet API定义在哪里说明容器应该做什么?我知道它无法更改已经在连接中的HTTP响应代码,但是为什么它要在关闭之前编写一个零长度的块。对不起,我不是说规范不允许您想要的行为,只是没有任何方法可以使用当前版本的API中可用的方法来实现它。引用?当我的Servlet在提交点之后抛出一些GenericError时,Servlet API定义在哪里说明容器应该做什么?我知道它不会改变