在给定会话ID时,Java Applet似乎使用旧的响应对象

时间:2013-01-10 13:12:30

标签: java java-ee servlets jsf-2 applet

我的jsf页面中有一个文件上传小程序。这个小程序需要一个地址,它可以发送它的POST请求。 (我无法编辑此帖子请求以添加更多字段或其他内容)。然后我的servlet的post方法存储文件。托管bean无法完成此作业,因为必须使用@MultiPartConfig注释servlet,并且我无法将此批注添加到jsf托管bean。为了强制上传小程序使用相同的会话,我根据此topic向帖子请求添加了名为jsessionId的URL属性。现在,每当我尝试在会话期间上传多个文件时,applet就会停止,并在响应正文中找不到错误消息“regexp string”^ SUCCESS $“这是因为applet需要在servlet响应中使用此字符串为了知道上传成功了。

当我查看applet的调试代码时,响应包含很多html代码但不包含此成功字符串,尽管我将其添加到我的Servlet代码中。这是我的servlet的代码:

@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();
    }
}

applet使用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>

在尝试上传第二个文件之后,“旧”(我认为但我对servlet知之甚少)响应如下:http://pastebin.ca/2300999 (太多字符所以我不得不在那里上传)

1 个答案:

答案 0 :(得分:2)

您的问题是由于servlet正在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

小程序基本上是通过HEAD请求测试postURL的可用性,一旦确定它已被重定向,它就将重定向的URL用作新的postURL(根据copypasted日志的最后一行) )。但是,重定向的URL指向一个返回大量HTML的JSF页面。

您需要修复您的doGet()不执行重定向,或添加doHead(),实际上不返回任何内容。由于HEAD根据HTTP规范基本上是没有响应主体的GET,因此默认doHead()实现委托给doGet()并丢弃响应主体。覆盖doHead()会阻止其委托给doGet()