连接被强制关闭servlet中的错误

时间:2011-11-28 15:12:50

标签: java exception ioexception

我在java servlet中遇到错误。 servlet填充现有pdf的字段。该页面会发出警告,询问“您要打开还是保存此文件?”因此,如果我按“打开”或“保存”,它可以正常工作,并做正确的事情。但是....如果我按“取消”,没有任何弹出,我收到此错误:

com.evermind.server.http.HttpIOException: An existing connection was forcibly closed by the remote host

我不确定此错误发生的原因或位置,但它表示错误发生在此行:

stamp.close();

如果需要更多代码段,请告知我们。我只是不想在这里粘贴所有东西,因为我不知道它发生在哪里。提前谢谢。

修改

以下是我的大部分相关代码:

    try {      

conn = ((DataSource) new InitialContext().lookup(dSource)).getConnection();

    stmt = conn.prepareStatement("....");    

rs = stmt.executeQuery();

if (rs.next()) {
    ....
}

    stmt = conn.prepareStatement("....");

    rs = stmt.executeQuery();


if (rs.next()) {      
    ....
}  

if (isTempVerification) {

     final String tempFile = "TemporaryVerification.pdf";

     try {

         response.setHeader(contentDisposition, "attachment; filename=" + tempFile);
         reader = new PdfReader(this.getServletContext().getResource("/pdf/" + tempFile));
         stamp = new PdfStamper(reader, response.getOutputStream());
         form = stamp.getAcroFields();
         form.setField("date", current);
         form.setField("reply_line", replyLine);
         form.setField("first_middle_last", fmlName);
         form.setField("term_year_1", termYear + ".");
         form.setField("census_date", termCensus);
         form.setField("term_year_2", termYear + ".");

         //stamp.setFormFlattening(true);
         stamp.close();

     } catch (IOException e) {
         errorFound = true;
         e.printStackTrace(System.err);
     } catch (DocumentException e) {
         errorFound = true;
         e.printStackTrace(System.err);
     }

} else {

    final String officialFile = "OfficialVerification.pdf";

    try {

        response.setHeader(contentDisposition, "attachment; filename=" + officialFile);    
        reader = new PdfReader(this.getServletContext().getResource("/pdf/" + officialFile));
        stamp = new PdfStamper(reader, response.getOutputStream());
        form = stamp.getAcroFields();
        form.setField("date", current);
        form.setField("reply_line", replyLine);
        form.setField("first_middle_last", fmlName);
        form.setField("status", studentStatus);
        form.setField("hr", hoursTaken);
        form.setField("term_year", termYear);
        form.setField("start_end_date", termStart + " - " + termEnd);

        //stamp.setFormFlattening(true);
        stamp.close();

    } catch (IOException e) {
        errorFound = true;
        e.printStackTrace(System.err);
    } catch (DocumentException e) {
        errorFound = true;
        e.printStackTrace(System.err);
    }

}

} catch (NamingException e) {
    e.printStackTrace(System.err);
} catch (SQLException e){
    e.printStackTrace(System.err);
} finally {if (stmt != null) try {stmt.close();
    } catch (SQLException e){
            e.printStackTrace(System.err);
    } if (rs != null) try {rs.close();
            } catch (SQLException e){
                e.printStackTrace(System.err);}
   try {
    if (conn != null && !conn.isClosed()) {
      conn.close();
    }
   } catch (SQLException e) {
    e.printStackTrace(System.err);
   } 
} 

1 个答案:

答案 0 :(得分:1)

当你进行stamp.close()调用时,输出流也会被刷新。由于您在stamp.close()之前设置了响应标头,因此响应标头也会写入客户端。因此,这会导致文件下载对话框出现在客户端上。当客户端点击“取消”时,http连接终止。

你的servlet需要在整个执行过程中维护http连接,因为它会将输出写入响应输出流。如果http连接在提交响应之前终止,您将获得您现在看到的异常。