処理してからサードパーティに投稿する必要があるフォームがいくつかあります。Apache HTTPClient を使用してこれを行うサーブレットを作成しました。これはかなりうまく機能します。ファイルを含むマルチパートでエンコードされたリクエストとマルチパートでエンコードされていないリクエストの両方を処理するために必要だったので、これを作成して /ProcessForm にマップしました。
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
String errorPage = "/";
URLEncoder encoder = new URLEncoder();
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
// See what kinda request we have
if(ServletFileUpload.isMultipartContent(request)) {
// Handle the multi-part data
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> items = upload.parseRequest(request);
for(FileItem item : items) {
if(item.isFormField()) {
// Parse non-file field
String name = item.getFieldName();
String val = item.getString();
entity.addPart(name, new StringBody(val));
} else {
// Parse file-field
String fieldName = item.getFieldName();
String fileName = item.getName();
byte[] data = item.get();
ContentBody fileBody = new ByteArrayBody(data, fileName);
entity.addPart(fieldName, fileBody);
}
}
} catch(Exception e) {
Logger.error(this, "Exception Parsing Form", e);
response.sendRedirect(errorPage);
return;
}
} else {
// Handle a non-multipart form
Enumeration<String> parameterNames = request.getParameterNames();
for (; parameterNames.hasMoreElements();) {
String name = parameterNames.nextElement();
String[] vals = request.getParameterValues(name);
for(String val : vals){
entity.addPart(name, new StringBody(val));
}
}
}
// DO SOME PROCESSING WITH THE DATA ...
String actionPath = "https://some-third-party-site.com";
// Post the data to the action Path
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.setRedirectStrategy(new DefaultRedirectStrategy() {
public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) {
boolean isRedirect=false;
try {
isRedirect = super.isRedirected(request, response, context);
} catch (Exception e) {
Logger.debug(this,"Some Exception checking for redirect",e);
}
if (!isRedirect) {
int responseCode = response.getStatusLine().getStatusCode();
if (responseCode == 301 || responseCode == 302) return true;
}
return isRedirect;
}
});
ResponseHandler<String> responseHandler = new BasicResponseHandler();
HttpPost httpPost = new HttpPost(actionPath);
httpPost.getParams().setParameter("http.protocol.handle-redirects",true);
httpPost.setEntity(entity);
String resp = "";
try {
resp = httpclient.execute(httpPost, responseHandler);
} catch(Exception e) {
Logger.error(this, "Exception Posting Form", e);
httpPost.releaseConnection();
response.sendRedirect(errorPage);
return;
}
PrintWriter out = response.getWriter();
out.write(resp);
out.flush();
out.close();
httpPost.releaseConnection();
return;
}
これはうまく機能します-問題は、サードパーティへのリクエストが私のサーブレットによって「プロキシ」され、権限がこれを好まないことです。最終的に URL をhttps://our-site.com/ProcessFormにしたくありません。 https://the-third-party-site.com/whateverにしたいと考えています。
私はこれを行う方法を理解しようとしてきましたが、これまでのところ、機能する方法を思い付いていません。ファイルのアップロードを処理できる必要があるため、応答をリダイレクトすることはできません。
私は、点と点を明白な何かと結びつけていないだけであり、おそらくそれを複雑にしすぎていると確信しています. どんな助けにも感謝します。