Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RequestDispatcher for remote server?

Tags:

java

servlets

I am trying to create a HttpServlet that forwards all incoming requests as is, to another serlvet running on a different domain.

How can this be accomplished? The RequestDispatcher's forward() only operates on the same server.

Edit: I can't introduce any dependencies.

like image 440
bjornl Avatar asked Oct 12 '10 15:10

bjornl


People also ask

What is the purpose of RequestDispatcher interface?

Interface RequestDispatcher. Defines an object that receives requests from the client and sends them to any resource (such as a servlet, HTML file, or JSP file) on the server.

Why we use RequestDispatcher instead of sendRedirect?

The RequestDispatcher interface allows you to do a server side forward/include whereas sendRedirect() does a client side redirect. SendRedirect() will search the content between the servers. it is slow because it has to intimate the browser by sending the URL of the content.

What are the two methods of RequestDispatcher interface?

The RequestDispatcher interface provides the option of dispatching the client's request to another web resource, which could be an HTML page, another servlet, JSP etc. It provides the following two methods: public void forward(ServletRequest request, ServletResponse response)throws ServletException, java. io.


2 Answers

You can't when it doesn't run in the same ServletContext or same/clustered webserver wherein the webapps are configured to share the ServletContext (in case of Tomcat, check crossContext option).

You have to send a redirect by HttpServletResponse.sendRedirect(). If your actual concern is reusing the query parameters on the new URL, just resend them along.

response.sendRedirect(newURL + "?" + request.getQueryString());

Or when it's a POST, send a HTTP 307 redirect, the client will reapply the same POST query parameters on the new URL.

response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);
response.setHeader("Location", newURL);

Update as per the comments, that's apparently not an option as well since you want to hide the URL. In that case, you have to let the servlet play for proxy. You can do this with a HTTP client, e.g. the Java SE provided java.net.URLConnection (mini tutorial here) or the more convenienced Apache Commons HttpClient.

If it's GET, just do:

InputStream input = new URL(newURL + "?" + request.getQueryString()).openStream();
OutputStream output = response.getOutputStream();
// Copy.

Or if it's POST:

URLConnection connection = new URL(newURL).openConnection();
connection.setDoOutput(true);
// Set and/or copy request headers here based on current request?

InputStream input1 = request.getInputStream();
OutputStream output1 = connection.getOutputStream();
// Copy.

InputStream input2 = connection.getInputStream();
OutputStream output2 = response.getOutputStream();
// Copy.

Note that you possibly need to capture/replace/update the relative links in the HTML response, if any. Jsoup may be extremely helpful in this.

like image 167
BalusC Avatar answered Oct 11 '22 10:10

BalusC


As others have pointed out, what you want is a proxy. Your options:

  1. Find an open-source Java library that does this. There are a few out there, but I haven't used any of them, so I can't recommend any.

  2. Write it yourself. Shouldn't be too hard, just remember to deal with stuff like passing along all headers and response codes.

  3. Use the proxy module in Apache 2.2. This is the one I'd pick, because I already know that it works reliably.

like image 35
Mike Baranczak Avatar answered Oct 11 '22 10:10

Mike Baranczak