1

jsfページにファイルアップロードアプレットがあります。このアプレットは、POSTリクエストを送信できるアドレスを期待しています。(この投稿リクエストを編集して、フィールドなどを追加することはできません)。次に、サーブレットのpostメソッドがファイルを保存します。サーブレットには@MultiPartConfigアノテーションを付ける必要があり、このアノテーションをjsfマネージドBeanに追加できないため、このジョブはマネージドBeanでは実行できません。アップロードアプレットが同じセッションを使用するように強制するために、このトピックに従って、jsessionIdという名前のURL属性をPOSTリクエストに追加しました。これで、セッション中に複数のファイルをアップロードしようとすると、「regexp文字列 "^ SUCCESS $"が応答本文に見つかりませんでした」というエラーメッセージが表示されてアプレットが停止します。これは、アプレットがサーブレットの応答でこの文字列を予期しているためです。アップロードが成功したことを知るため。

アプレットのデバッグコードを表示すると、応答には多くのhtmlコードが含まれていますが、サーブレットコードに追加しても、この成功文字列は含まれていません。これが私のサーブレットのコードです:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.reset();
    if (!userBean.getUploadedDatasets().isEmpty()) {
        String datasetID = userBean.getUploadedDatasets().getLast().replaceAll("/", "%2F");
        response.sendRedirect(response.encodeRedirectURL("http://____________/faces/details.xhtml?id="+datasetID));
    }
}

/**
 * Handles the HTTP
 * <code>POST</code> method.
 *
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response){
    PrintWriter out = null;
    try {
        Part filePart = request.getPart("item");
        InputStream filecontent = filePart.getInputStream();
        String datasetID = repBean.persistDataset(filecontent, uploadBean.getFolder());
        userBean.getUploadedDatasets().add(datasetID);
        out = response.getWriter();
        out.println("SUCCESS");
    } catch (ServletException ex) {
        Logger.getLogger(RequestHandler.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(RequestHandler.class.getName()).log(Level.SEVERE, null, ex);
    }finally{
        out.close();
    }
}

doGetメソッドはアプレットによってafterUploadURLとして使用されます(ファイルがアップロードされた後にジャンプされるURLです)

アプレットコードは次のとおりです。

          <APPLET
           CODE="wjhk.jupload2.JUploadApplet"
           NAME="JUpload"
           ARCHIVE="wjhk.jupload.jar"
           WIDTH="640"
           HEIGHT="300"
           MAYSCRIPT="true"
           ALT="The java pugin must be installed.">
           <param name="postURL" value="http://________________/request;jsessionid=#{session.id}" />
           <!-- Optionnal, see code comments -->
           <param name="showLogWindow" value="false" />
           <param name="debugLevel" value="99" />
           <param name="httpUploadParameterName" value="item" />
           <param name="nbFilesPerRequest" value="1" />
           <param name="httpUploadParameterType" value="oneFile" />
           <param name="afterUploadURL" value="http://________________/request" />
          </APPLET>

2番目のファイルをアップロードしようとすると、「古い」(これは私が思うが、サーブレットについては十分に理解していない)応答は次のようになります。http://pastebin.ca/2300999 (文字が多すぎるため、そこにアップロードしてください)

4

1 に答える 1

2

この問題は、サーブレットがGET(および暗黙的にHEAD)要求でリダイレクトを送信しているために発生します。ログの次の部分には、関連情報が含まれています。

00064   13:44:42.482      HttpProtocolFinderThread     [DEBUG]      Getting serverProtocol from HEAD request
00065   13:44:42.485      HttpProtocolFinderThread     [DEBUG]      Checking protocol with URL: http://___________________:8080/application1/request;jsessionid=47440f88e532021656b3724eea33
00066   13:44:42.501      HttpProtocolFinderThread     [DEBUG]      [initByteArrayEncoder] proxy=DIRECT, proxy.type=DIRECT, useProxy=false, url.host=___________________, url.port=8080
00067   13:44:42.501      HttpProtocolFinderThread     [DEBUG]      [onAppendHeader] Start
00068   13:44:42.502      HttpProtocolFinderThread     [DEBUG]      [onAppendHeader] Header appended; Cookie: __utma=132868616.170774110.1354796930.1356109339.1356547898.3; __utmz=132868616.1356547898.3.3.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided)
00069   13:44:42.509      HttpProtocolFinderThread     [DEBUG]      [onAppendHeader] Header appended; User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:16.0) Gecko/20100101 Firefox/16.0
00070   13:44:42.510      HttpProtocolFinderThread     [DEBUG]      [onAppendHeader] End
00071   13:44:42.510      HttpProtocolFinderThread     [DEBUG]      [HTTPConnectionHelper append]
00072   13:44:42.511      HttpProtocolFinderThread     [DEBUG]      Before sendRequest()
00073   13:44:42.511      HttpProtocolFinderThread     [DEBUG]      Using non SSL socket, direct connection
00074   13:44:42.538      HttpProtocolFinderThread     [DEBUG]      After sendRequest()
00075   13:44:42.538      HttpProtocolFinderThread     [DEBUG]      -------------------------------------------------------------------------
00076   13:44:42.538      HttpProtocolFinderThread     [DEBUG]      -----------------   HEAD message sent (start)  --------------------------
00077   13:44:42.539      HttpProtocolFinderThread     [DEBUG]      -------------------------------------------------------------------------
00078   13:44:42.539      HttpProtocolFinderThread     [DEBUG]      HEAD /application1/request;jsessionid=47440f88e532021656b3724eea33 HTTP/1.1
00078   13:44:42.539      HttpProtocolFinderThread     [DEBUG]      Host: ___________________:8080
00078   13:44:42.539      HttpProtocolFinderThread     [DEBUG]      Accept: */*
00078   13:44:42.539      HttpProtocolFinderThread     [DEBUG]      Accept-Encoding: identity
00078   13:44:42.539      HttpProtocolFinderThread     [DEBUG]      Connection: close
00078   13:44:42.539      HttpProtocolFinderThread     [DEBUG]      Cookie: __utma=132868616.170774110.1354796930.1356109339.1356547898.3; __utmz=132868616.1356547898.3.3.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided)
00078   13:44:42.539      HttpProtocolFinderThread     [DEBUG]      User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:16.0) Gecko/20100101 Firefox/16.0
00078   13:44:42.539      HttpProtocolFinderThread     [DEBUG]      
00079   13:44:42.539      HttpProtocolFinderThread     [DEBUG]      -------------------------------------------------------------------------
00080   13:44:42.540      HttpProtocolFinderThread     [DEBUG]      -----------------   HEAD message sent (end) -----------------------------
00081   13:44:42.540      HttpProtocolFinderThread     [DEBUG]      -------------------------------------------------------------------------
00082   13:44:42.548      HttpProtocolFinderThread     [DEBUG]      -------- Response Headers Start --------
00083   13:44:42.556      HttpProtocolFinderThread     [DEBUG]      HTTP/1.1 302 Moved Temporarily
00084   13:44:42.558      HttpProtocolFinderThread     [DEBUG]      Location: http://___________________:8080/application1/faces/details.xhtml;jsessionid=47440f88e532021656b3724eea33?id=%2F37ded64f-f2c9-4b90-99ea-79c34eb140e5
00085   13:44:42.559      HttpProtocolFinderThread     [DEBUG]      Content-Type: text/html;charset=ISO-8859-1
00086   13:44:42.566      HttpProtocolFinderThread     [DEBUG]      Content-Language: de-DE
00087   13:44:42.578      HttpProtocolFinderThread     [DEBUG]      Content-Length: 306
00088   13:44:42.578      HttpProtocolFinderThread     [DEBUG]      Date: Thu, 10 Jan 2013 12:44:42 GMT
00089   13:44:42.579      HttpProtocolFinderThread     [DEBUG]      Connection: close
00090   13:44:42.579      HttpProtocolFinderThread     [DEBUG]      
00091   13:44:42.580      HttpProtocolFinderThread     [DEBUG]      --------- Response Headers End ---------
00092   13:44:42.580      HttpProtocolFinderThread     [DEBUG]      This is a HEAD request: we don't care about the bytearrayResponseBody
00093   13:44:42.584      HttpProtocolFinderThread     [DEBUG]      HEAD status: 302
00094   13:44:42.585      HttpProtocolFinderThread     [DEBUG]      HEAD protocol: HTTP/1.1
00095   13:44:42.586      HttpProtocolFinderThread     [DEBUG]      Location read: http://___________________:8080/application1/faces/details.xhtml;jsessionid=47440f88e532021656b3724eea33?id=%2F37ded64f-f2c9-4b90-99ea-79c34eb140e5
00096   13:44:42.594      HttpProtocolFinderThread     [INFO]       postURL switched from http://___________________:8080/application1/request;jsessionid=47440f88e532021656b3724eea33 to http://___________________:8080/application1/faces/details.xhtml;jsessionid=47440f88e532021656b3724eea33?id=%2F37ded64f-f2c9-4b90-99ea-79c34eb140e5

The applet is basically testing the availability of postURL by a HEAD request and once determined that it's been redirected, it's using the redirected URL as new postURL (as per the last line of the copypasted log). However, the redirected URL is pointing to a JSF page which returns a whole bunch of HTML.

You need to fix your doGet() that it doesn't perform a redirect, or to add a doHead() which returns effectively nothing. As a HEAD is per the HTTP specification basically a GET without a response body, the default doHead() implementation delegates to the doGet() and discards the response body. Overriding the doHead() should prevent it from delegating to doGet().

于 2013-01-10T13:39:46.097 に答える