そのため、ログインフォームがあるこのWebサイトがあります。ログインしてからファイルをダウンロードしたい。フォームを送信すると、ユーザー名とパスワードが http POST で送信されるだけでなく、隠し<input>
タグにあるトークンも送信されます。さて、私の問題は、JavaでURLを開いてトークンを取得してPOSTを作成すると、HttpClient
. Web サイトを呼び出してトークンを取得し、投稿を行うために、何らかの形で同じクライアントを使用する必要があります。残念ながら、ファイルにアクセスしようとすると、403 FORBIDDEN リターン コードが返されます。これは私がこれまでに持っているものです:
public static void main(String[] args){
try {
String token = getTokenFromPage("http://my.url");
HttpContext context = new BasicHttpContext();
DefaultHttpClient client = new DefaultHttpClient();
List <NameValuePair> parameters = new ArrayList <NameValuePair>();
HttpPost post = new HttpPost("http://my.url");
parameters.add(new BasicNameValuePair("username", "MYNAME"));
parameters.add(new BasicNameValuePair("password", "MYPW"));
parameters.add(new BasicNameValuePair("token", token));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, HTTP.UTF_8);
post.setEntity(entity);
System.out.println("URL: " + post.getURI());
HttpResponse postResponse = client.execute(post, context);
System.out.println(postResponse.getStatusLine());
EntityUtils.consume(postResponse.getEntity());
//Now download the file
HttpGet httpget = new HttpGet("http://url.to.file");
HttpResponse getResponse = client.execute(httpget, context);
System.out.println(getResponse.toString());
System.out.print((postResponse.getEntity().getContent()));
client.getConnectionManager().shutdown();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}