我在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);
}
}
答案 0 :(得分:1)
当你进行stamp.close()
调用时,输出流也会被刷新。由于您在stamp.close()
之前设置了响应标头,因此响应标头也会写入客户端。因此,这会导致文件下载对话框出现在客户端上。当客户端点击“取消”时,http连接终止。
你的servlet需要在整个执行过程中维护http连接,因为它会将输出写入响应输出流。如果http连接在提交响应之前终止,您将获得您现在看到的异常。