True redirection in the HTTP sense is not possible with a POST request, but
that does not mean that you can't accomplish the same end result.  There are
two options, depending on where you want to "redirect" to.

First, some insight.  An HTTP redirect is nothing more than a response to an
HTTP request that contains a 3xx return code and a location header.  Almost
every browser out there should respond to that return code by submitting a
GET or HEAD request to the URL specified in the location header (whichever
was used in the original request).  If necessary, the value of the location
header can contain query parameters.

That is the mechanism that web designers use to accomplish many "tricks".
It's useful once processing of a form request is completed, to redirect the
user to a page designed to display the results of the form processing.  It
can also be used to forward people that come to your old address to a new
address (kind of like the Post Office forwards your mail to you when you
move).

On to the options:

1)  If you want to redirect to another page in your web application, you can
use the javax.servlet.RequestDispatcher.redirect() method.  This redirection
never actually goes back to the browser, it just internally forward the
request (with any attributes you define) to the Servlet/JSP that is
responsible for processing that page in your web application.  The URL bar
on the user's browser will still contain the request as it was passed to the
original Servlet/JSP.

2)  Perform your own HTTP request and stream the results back to the
browser.  This sounds harder than it is.  Basically you create a
java.net.HttpURLConnection with the URL of the web site you want to
"redirect" to.  This can actually contain the query parameters (as long as
they're not too large) since it will never be sent to the user's browser
either and will not appear in the browser URL bar.  Open the connection, get
the content and write it to the Servlet's OutputStream.

Hope this helps.
  (*Chris*)

-----Original Message-----
From: A mailing list for discussion about Sun Microsystem's Java Servlet API
Technology. [mailto:[EMAIL PROTECTED] On Behalf Of Garey Mills
Sent: Wednesday, June 22, 2005 8:33 am
To: SERVLET-INTEREST@JAVA.SUN.COM
Subject: Re: [SERVLET-INTEREST] redirecting from a servlet to an exterior
URL using a POST

Paul -

        Thank you for your response. After posting this question, I took a
look at RFC 2616 and found this:

        10.3 Redirection 3xx
This class of status code indicates that further action needs to be taken
by the user agent in order to fulfill the request.
The action required MAY be carried out by the user agent without
interaction with the user if and only if the method
used in the second request is GET or HEAD.


        My reading of that is that redirection with a POST can't be done.
Am I reading it wrong?


> If you really want to do a POST take a look at Jakarta HttpClient for a
> start.
>
> http://jakarta.apache.org/commons/httpclient/3.0/index.html

        My situation is exactly this. I have provide an authentication
step for users accessing a resource the university pays for. The
university has a password and user name that should not be exposed to the
end user. I have an authentication facility that I pass a URL (to a
servlet) to be
connected to once the end user is authenticated. What I would like is to
be able to formulate a POST request in the servlet and then foward the
end user to it.

        It sounds to me that you are suggesting that in the servlet I
should open an HTTP connection to the resource and read out the resulting
page as though it were the servlet's response. I'm going to try that,
though I can imagine various things going wrong.

Thanks again for the help;

Garey Mills
Library Systems Office
UC Berkeley

The brain is not where you think

On Wed, 22 Jun 2005, Paul Copeland wrote:

> Probably RequestDispacther.forward won't do what you want unless the
> external URL is in the same ServletContext or at least on the same server.
>
> If you have control of the other end you might forward with a
> java.net.HttpURLConnection and just write into the OutputStream on one
> end and read on the other end with ServletRequest.getReader(). Or even
> sending a serialized object...
>
> If you really want to do a POST take a look at Jakarta HttpClient for a
> start.
>
> http://jakarta.apache.org/commons/httpclient/3.0/index.html
>
> Paul Copeland
> JOT Servlets Web Component Framework
> http://www.jotobjects.com
>
> >------------------------------
> >
> >Date:    Wed, 22 Jun 2005 10:19:28 +0800
> >From:    Sreenath <[EMAIL PROTECTED]>
> >Subject: Re: redirecting from a servlet to an exterior URL using a POST
> >
> >Hi Gary
> >
> >  As long as u use requestDispacther.forward("")(Instead of redirect) ,
> >the URL won't be visible .rather ur servlet URL will be visible in the
> >address bar . So as long as URL is not visible GET and POST shouldn $B!G
(Bt
> >make any difference until unless u r sending some multi-form data
> >
> >
> >
> >-----Original Message-----
> >From: A mailing list for discussion about Sun Microsystem's Java Servlet
> >API Technology. [mailto:[EMAIL PROTECTED] On Behalf Of
> >Garey Mills
> >Sent: 2005 $BG/ (B6 $B7n (B22 $BF| (B 0:21
> >To: SERVLET-INTEREST@JAVA.SUN.COM
> >Subject: redirecting from a servlet to an exterior URL using a POST
> >
> >Hello -
> >
> >        Once a servlet I am writing is accessed, I want to set the
> >values
> >on several parameters and then redirect to an exterior URL, sending
> >along
> >the parameters. But I do not want the parameters exposed, so putting
> >them
> >into the URL as a query string won't work, I need a POST.
> >
> >        Has anybody done this?
> >
> >Garey Mills
> >Library Systems Office
> >UC Berkeley
> >
> >
> >
> >
>
>
___________________________________________________________________________
> To unsubscribe, send email to [EMAIL PROTECTED] and include in the
body
> of the message "signoff SERVLET-INTEREST".
>
> Archives: http://archives.java.sun.com/archives/servlet-interest.html
> Resources: http://java.sun.com/products/servlet/external-resources.html
> LISTSERV Help: http://www.lsoft.com/manuals/user/user.html
>

___________________________________________________________________________
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff SERVLET-INTEREST".

Archives: http://archives.java.sun.com/archives/servlet-interest.html
Resources: http://java.sun.com/products/servlet/external-resources.html
LISTSERV Help: http://www.lsoft.com/manuals/user/user.html

___________________________________________________________________________
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff SERVLET-INTEREST".

Archives: http://archives.java.sun.com/archives/servlet-interest.html
Resources: http://java.sun.com/products/servlet/external-resources.html
LISTSERV Help: http://www.lsoft.com/manuals/user/user.html

Reply via email to