Соединение было принудительно закрыто ошибка в сервлете - PullRequest
0 голосов
/ 28 ноября 2011

Я получаю ошибку в своем сервлете Java.Сервлет заполняет поля существующего 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 Ответ

1 голос
/ 28 ноября 2011

когда вы делаете вызов stamp.close(), выходной поток также сбрасывается.поскольку вы устанавливаете заголовки ответа до stamp.close(), заголовки ответа также записываются клиенту.следовательно, это вызывает диалог загрузки файла на клиенте.когда клиент нажимает кнопку «отмена», соединение http прерывается.

ваши сервлеты должны поддерживать соединение http на протяжении всего своего выполнения, так как оно будет записывать вывод в поток вывода ответа.если соединение http прервано до того, как ответ будет принят, вы получите исключение, которое вы видите сейчас.

...