java .io.IOException при публикации multipart / form-data из Firefox 74/75 и использовании Apache AJP-коннектора на стороне сервера - PullRequest
0 голосов
/ 01 мая 2020

Начиная с версии 74 Firefox, файл, отправленный с использованием формы "multipart / form-data" с размером файла более 1,8 МБ, вызывает ошибку.

Примечание: файл, отправленный с использованием AJAX, работает нормально , Причиной проблемы является только многочастная форма.

HTML код:

<form name="formUpload" action="AdminImportInssAseg" method="POST"
            enctype="multipart/form-data" onsubmit="return validate_form(this);">
    <table class="centrado green">
        <tr>
            <td><input type="File" name="miadjuntoSolvenciaX" class="mdt">&nbsp;
            </td>
        </tr>
        <tr>
            <td align="center" colspan="2"><a href="#"
                onClick="if(validate_form(formUpload)) formUpload.submit();"
                title="Importar el archivo"><img alt='' border="0"
                    src="./images/add.gif" height="30"></a></td>
        </tr>
    </table>
</form>

Java код:

            FileItemIterator iter = upload.getItemIterator(request);
            while (iter.hasNext()) {
                FileItemStream item = iter.next();
                if (item.isFormField()) {
                    continue;
                } else {
                        filename = item.getName();
                        contentType = item.getContentType();
                        String inputLine;
                        InputStream fis = item.openStream();
                        BufferedReader in = null;
                        in = new BufferedReader(new InputStreamReader(fis,"ISO-8859-1"));
                        while ((inputLine = in.readLine()) != null) {
                            try{
                                out.println("*"+inputLine+"*<br>");
                            }
                            catch (Exception e){
                                out.println("<p>Error: <b>"+e.getMessage() + "</b></p>");
                            }
                        }
                        fis.close();
                }
            }

Я вижу, что он читает файл, но происходит сбой в середине при использовании Firefox 74 +.

Под этим сообщением можно найти трассировку стека ошибок.

При использовании Firefox 73 или ниже все работает нормально.

При подключении напрямую к порту Tomcat (без использования разъема AJP) все работает нормально (в том числе с Firefox 74/75).

Код используется уже более десяти лет. Java кодирование, Apache и Tomcat не были изменены в последнее время.

Server version: Apache/2.4.43 (Linux/SUSE)

Я заметил, что "временный" сохраненный файл всегда обрезается в 188416 байт (в то время как загруженный файл на самом деле больше).

csimon@linux-069t:/tomcat/temp> l
total 376
drwxr-xr-x 2 csimon users   4096 may  1 10:53 ./
drwxr-xr-x 9 csimon users   4096 ago 29  2018 ../
-rw-r--r-- 1 csimon users 188416 may  1 10:45 EMP59_AF_GA_202005011.CSV
-rw-r--r-- 1 csimon users 188416 may  1 10:37 EMP59_AF_GA_20200501.CSV

Производственный пользователь сообщил о проблеме, но я мог воспроизвести ее локально.

Проблема возникает только при использовании Firefox 74 и 75 ( Я тестировал с Firefox 71 -> 75), поэтому должно быть связано с некоторыми изменениями в Firefox (по крайней мере, Linux и Windows версии). Я не смог найти объяснения, глядя на заметки о выпуске Firefox. Любой, кто получает представление о том, что может вызвать это, и как это можно исправить.

У меня уже было Firefox проблем, связанных с обновлением в прошлом, обычно исправлялось изменение некоторых значений в Firefox Конфиг через "about: config". Хитрость заключается в поиске нужного параметра для обновления ...

Журнал ошибок из журнала соединителя AJP при использовании Firefo 74 +:

[Sat May 02 18:27:55.801 2020] [15619:139986498496512] [info] init_jk::mod_jk.c (3591): mod_jk/1.2.46 initialized
[Sat May 02 18:27:55.805 2020] [15619:139986498496512] [info] init_jk::mod_jk.c (3591): mod_jk/1.2.46 initialized
[Sat May 02 18:28:02.669 2020] [15641:139986189342464] [info] ajp_process_callback::jk_ajp_common.c (2074): (ajp13) Writing to client aborted or client network problems
[Sat May 02 18:28:02.669 2020] [15641:139986189342464] [info] ajp_service::jk_ajp_common.c (2775): (ajp13) sending request to tomcat failed (unrecoverable), because of client write error (attempt=1)
[Sat May 02 18:28:02.670 2020] [15641:139986189342464] [info] jk_handler::mod_jk.c (2984): Aborting connection for worker=ajp13
[Sat May 02 18:28:15.289 2020] [15641:139986189342464] [info] ajp_read_into_msg_buff::jk_ajp_common.c (1550): (ajp13) receiving data from client failed. Connection aborted or network problems
[Sat May 02 18:28:15.289 2020] [15641:139986189342464] [info] ajp_process_callback::jk_ajp_common.c (2102): (ajp13) Reading from client aborted or client network problems
[Sat May 02 18:28:15.289 2020] [15641:139986189342464] [info] ajp_service::jk_ajp_common.c (2775): (ajp13) sending request to tomcat failed (unrecoverable), because of client read error (attempt=1)
[Sat May 02 18:28:15.310 2020] [15641:139986189342464] [info] jk_handler::mod_jk.c (2984): Aborting connection for worker=ajp13

Трассировка стека ошибок Tomcat при использовании Firefox 74+ :

java.io.IOException: Fallo en lectura de Conector
    at org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:313)
    at org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:364)
    at org.apache.coyote.ajp.AjpProcessor.receive(AjpProcessor.java:331)
    at org.apache.coyote.ajp.AbstractAjpProcessor.refillReadBuffer(AbstractAjpProcessor.java:662)
    at org.apache.coyote.ajp.AbstractAjpProcessor$SocketInputBuffer.doRead(AbstractAjpProcessor.java:1140)
    at org.apache.coyote.Request.doRead(Request.java:422)
    at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290)
    at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:449)
    at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315)
    at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:200)
    at com.oreilly.servlet.multipart.BufferedServletInputStream.fill(BufferedServletInputStream.java:64)
    at com.oreilly.servlet.multipart.BufferedServletInputStream.readLine(BufferedServletInputStream.java:108)
    at com.oreilly.servlet.multipart.LimitedServletInputStream.readLine(LimitedServletInputStream.java:60)
    at com.oreilly.servlet.multipart.PartInputStream.fill(PartInputStream.java:97)
    at com.oreilly.servlet.multipart.PartInputStream.read(PartInputStream.java:195)
    at com.oreilly.servlet.multipart.PartInputStream.read(PartInputStream.java:156)
    at com.oreilly.servlet.multipart.FilePart.write(FilePart.java:208)
    at com.oreilly.servlet.multipart.FilePart.writeTo(FilePart.java:167)
    at com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:271)
    at servlet.presentacion.admin.AdminImportInssAseg.doPost(AdminImportInssAseg.java:101)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:193)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Заголовок Firefox версия 72: enter image description here

Заголовок Firefox версия 75: enter image description here

1 Ответ

0 голосов
/ 03 мая 2020

Сбой при использовании com.oreilly.servlet.MultipartRequest. Не удалось использовать org. apache .commons.fileupload.

Работает с использованием Java Технология сервлетов и , установив maxFileSize выше (по умолчанию 2 МБ).

Я не могу понять, почему он работает со старыми версиями Firefox, а не с новыми ... но моя проблема решена.

@WebServlet("/AdminImportInssAseg")
@MultipartConfig (fileSizeThreshold=1024*1024*10,   // 1 MB 
     maxFileSize=1024*1024*50,          // 50 MB
     maxRequestSize=1024*1024*100)      // 100 MB
public class AdminImportInssAseg extends HttpServlet {

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException,
        IOException {
        Part filePart = request.getPart("miadjuntoSolvenciaX"); // Retrieves <input type="file" name="file">
        filename = filePart.getName();
        fileSize = filePart.getSize();
        contentType = filePart.getContentType();
        InputStream fis = filePart.getInputStream();
        BufferedReader in = null;
        in = new BufferedReader(new InputStreamReader(fis,"ISO-8859-1"));
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
        ...
        }           
        fis.close();
        filePart.delete();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...