我的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 (太多字符所以我不得不在那里上传)
答案 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()
。