使用Java org.apache.http.client获取重定向URL

在向服务器发帖后,我需要帮助弄清楚如何获取重定向。 首先,我需要从服务器获取一些cookie。 然后我用cookie和其他参数执行post。 然后服务器以302重定向回答。 如何获取该重定向的url?

代码如下所示:

HttpGet get = new HttpGet(urlOne); try { //Creating a local instance of cookie store. CookieStore cookieJar = new BasicCookieStore(); // Creating a local HTTP context HttpContext localContext = new BasicHttpContext(); // Bind custom cookie store to the local context localContext.setAttribute(ClientContext.COOKIE_STORE, cookieJar); HttpResponse response = httpClient.execute(get, localContext); HttpEntity entity = response.getEntity(); System.out.println("------------------GET----------------------"); System.out.println(response.getStatusLine()); if (entity != null) { System.out.println("Response content length: " + entity.getContentLength()); } // Print out cookies obtained from server List cookies = cookieJar.getCookies(); for (int i = 0; i < cookies.size(); i++) { System.out.println("Local cookie: " + cookies.get(i)); } if (entity != null) { entity.consumeContent(); } System.out.println("------------------GET-END---------------------"); // Create a new post HttpPost post = new HttpPost(urlTwo); post.setHeader("Content-Type", "application/x-www-form-urlencoded"); // Add params HttpParams params = new BasicHttpParams(); params.setParameter("action", "search"); params.setParameter("word", "hello"); post.setParams(params); //Execute HttpResponse response2 = httpClient.execute(post, localContext); 

看到我对这个问题的回答,

HttpClient 4 – 如何捕获上次重定向URL

我假设你想自动化浏览器操作并维护会话,这样你就可以访问那些需要维护会话的页面。

我不知道如何通过org.apache.http.client API。 如果您不限于使用org.apache.http.client API并且可以使用其他API,那么您可以使用HtmlUnit API,否则您可以忽略其余的答案。

通过HtmlUnit维护会话和自动化浏览器操作可以按如下方式完成:

 import com.gargoylesoftware.htmlunit.*; import com.gargoylesoftware.htmlunit.html.*; final WebClient webClient = new WebClient(); try { webClient.setJavaScriptEnabled(true); webClient.setThrowExceptionOnScriptError(false); webClient.setCssEnabled(true); webClient.setUseInsecureSSL(true); webClient.setRedirectEnabled(true); HtmlPage loginPage = webClient.getPage(new URL("https://www.orkut.com/")); System.out.println(loginPage.getTitleText()); List forms = loginPage.getForms(); HtmlForm loginForm = forms.get(0); HtmlTextInput username = loginForm.getInputByName("Email"); HtmlPasswordInput password = loginForm.getInputByName("Passwd"); HtmlInput submit = loginForm.getInputByName("signIn"); username.setValueAttribute("username"); password.setValueAttribute("password"); HtmlPage homePage = submit.click();. Thread.sleep(10 * 1000); HtmlPage homePageFrame = (HtmlPage) homePage.getFrameByName("orkutFrame").getEnclosedPage(); HtmlPage communitiesTestPage = (HtmlPage) webClient.openWindow(new URL("http://www.orkut.co.in/Main#Community?cmm=1"), "CommunitiesWindow").getEnclosedPage(); }catch(java.security.GeneralSecurityException e) { e.printStackTrace(); }catch(java.io.IOException e) { e.printStackTrace(); }catch(InterruptedException e) { e.printStackTrace(); } WebWindow ww = webClient.getWebWindowByName("CommunitiesWindow"); WebRequestSettings wrs1 = new WebRequestSettings(URL); // URL is the url that requires authentication first 

正如您所看到的,上述代码如何自动化浏览器操作以及如何自动维护会话。 我们不需要手动处理cookie或URLReDirect …

我在Java中有一种简单的方法。 以下是步骤:

  1. 创建HttpUrl连接。
  2. 设置HttpURLConnection.setFollowRedirects( true ); //默认情况下应该为true
  3. 通过HttpUrlConnection对象调用connect;
  4. 在连接之后,通过HttpUrlConnection对象调用getHeadersFields() ;
  5. 通过上面的HttpUrlConnection对象调用getUrl()来获取重定向的URL;

还有另一种使用HTTP标头中的位置字段获取它的方法,但有时我们不会在标头中获取位置字段。 它至少对我不起作用。 但是上面的方法,它确实有效。

location标题页中。