Before executing an HttpMethod
call,
setFollowRedirects(true)
on the method;
HttpClient
will take care of following any
redirects a server may return in a response. The following example
shows what happens when a method requests a CGI script that returns a
302
(moved temporarily) response code:
import
org.apache.commons.httpclient.HttpClient;import
org.apache.commons.httpclient.HttpException;import
org.apache.commons.httpclient.HttpMethod;import
org.apache.commons.httpclient.methods.GetMethod; HttpClient client =new
HttpClient( ); String url = "http://www.discursive.com/cgi-bin/jccook/redirect.cgi"; System.out.println( "Executing Method not following redirects: "); HttpMethod method =new
GetMethod( url ); method.setFollowRedirects(false
); executeMethod(client, method); System.out.println( "Executing Method following redirects: "); method = new GetMethod( url ); method.setFollowRedirects(true
); executeMethod(client, method);private
static
void
executeMethod(HttpClient client, HttpMethod method)throws
IOException, HttpException { client.executeMethod( method ); System.out.println( "Response Code: " + method.getStatusCode( ) ); String response = method.getResponseBodyAsString( ); System.out.println( response ); method.releaseConnection( ); method.recycle( ); }
This example executes two GetMethod
instances; the
first method is configured not to
follow redirects, and the second is configured to follow redirects.
The first method is executed, and the server sends a
302
response code. Since this method is not
configured to follow redirects, HttpClient
does
not make another request. When the second method is executed,
HttpClient
follows the initial redirect to a
redirect2.cgi
script, which sends another
redirect to /jccook/index.html
:
Executing Method not following redirects: 0 INFO [main] org.apache.commons.httpclient.HttpMethodBase - Redirect requested but followRedirects is disabled Response Code: 302 Executing Method following redirects: Response Code: 200 <html> <head> <title>JCCook Example</title> </head> <body> <h1>Hello World!</h1> </body> </html>
HttpClient
can handle any of the following
response codes specifying a redirect:
Status Code 302: HttpStatus.SC_MOVED_TEMPORARILY
Status Code 301: HttpStatus.SC_MOVED_PERMANENTLY
Status Code 303: HttpStatus.SC_SEE_OTHER
Status Code 307: HttpStatus.SC_TEMPORARY_REDIRECT
When a response code is retrieved, HttpClient
sends another GET request for the resource specified in the
Location
header. The following code is the first
request sent by a method configured
to
follow redirects:
GET /cgi-bin/jccook/redirect.cgi HTTP/1.1 User-Agent: Jakarta Commons-HttpClient/3.0final Host: www.discursive.com
The
redirect.cgi
script will then send a 302 Moved
response,
supplying a Location
header that points to redirect2.cgi
:
HTTP/1.1 302 Moved Date: Sat, 15 May 2004 19:30:49 GMT Server: Apache/2.0.48 (Fedora) Location: /cgi-bin/jccook/redirect2.cgi Content-Length: 0 Content-Type: text/plain; charset=UTF-8
HttpClient
then sends another GET request for the
resource specified in the previous response:
GET /cgi-bin/jccook/redirect2.cgi HTTP/1.1 User-Agent: Jakarta Commons-HttpClient/3.0final Host: www.discursive.com
The redirect2.cgi
is configured to send a
redirect for /jccook/index.html
, and the
response to the previous request does just that:
HTTP/1.1 302 Moved Date: Sat, 15 May 2004 19:30:49 GMT Server: Apache/2.0.48 (Fedora) Location: /jccook/index.html Content-Length: 0 Content-Type: text/plain; charset=UTF-8
How HttpClient
handles redirect responses can be
further customized by three configurable parameters on
HttpClient
.
REJECT_RELATIVE_REDIRECT
causes
HttpClient
to throw an exception if a server sends
a Location
header with a relative URL; for
instance, if the redirect.cgi
script returns a
Location
header of
../index.html
, the redirection causes an
exception if REJECT_RELATIVE_REDIRECT
is set to
true
. If
ALLOW_CIRCULAR_REDIRECTS
is set to
true
, HttpClient
throws an
exception if a series of redirects includes the same resources more
than once. MAX_REDIRECTS
allows you to specify a
maximum number of redirects to follow. The following example sets all
three parameters on an instance of
HttpClientParams
associated with an instance of
HttpClient
:
HttpClient client = new HttpClient( ); HttpClientParams params = client.getParams( ); params.setBooleanParameter( HttpClientParams.REJECT_RELATIVE_REDIRECT, false ); params.setBooleanParameter( HttpClientParams.ALLOW_CIRCULAR_REDIRECTS, false ); params.setIntParameter( HttpClientParams.MAX_REDIRECTS, 10 );
For more information on how HttpClient
handles
redirection, take a look at the source for
the
HttpMethodDirector
. The isRedirectNeeded()
and processRedirectResponse()
methods handle redirection, and the source
for this class can be viewed using ViewCVS (http://cvs.apache.org/viewcvs.cgi/jakarta-commons/httpclient/src/java/).
Navigate to the org.apache.commons.httpclient
package and click on HttpMethodDirector
.
18.219.71.21