1

As a developer of Java web application, when do I need to use URL Rewriting and what is the difference between URL Rewriting and Forwarding?

I searched on other websites, I get contradictory information depending upon whom you are talking to like SEO people would answer this question differently.

AFAIK in both cases the client (browser) is not informed of the change and the end user sees exactly same URL that the client originally requested when the repose is returned from the server.

Please that this question is in the context of Java Servlet API in which forward method and sendRedirect methods are defined in which redirecting and forwarding are completely 2 different things. This question is about the difference between forward (as defined by forward method in the Servlet API's) and URL rewriting. The question clearly states that the answer should be in the context of Java servlet. Most importantly when do I need to use URL rewriting, again in the context of developing Java web application.

ace
  • 11,526
  • 39
  • 113
  • 193
  • Your assumption is incorrect. Forwarding/redirecting is done by returning a 3xx to the browser along with a new URL for it to go to. – Brian Roach Oct 31 '11 at 01:14

2 Answers2

10

The term "forwarding" is ambiguous in this question. In JSP/Servlet world, "forwarding" is more known from the MVC concept that the request URL (as visible in browser address bar) effectively calls the servlet (as matched by its URL pattern in web.xml or @WebServlet) which acts as a controller to prepare the model and uses a JSP as view to present the model. That JSP in turn is been called by "forwarding". This is done by RequestDispatcher#forward():

request.getRequestDispatcher("/WEB-INF/foo.jsp").forward(request, response);

This does indeed not reflect the JSP's URL in the browser address bar. This takes place entirely server side. Basically, the servlet "loads" the JSP and passes the request/response to it so that it can do its job of generating the HTML stuff. Note that the JSP in the above example is hidden in /WEB-INF folder which makes it inaccessible for endusers trying to enter its full path in browser address bar.

In general web development world, the term "forwarding" is also known from "URL forwarding" which is essentially the same as URL redirection. This in turn indeed causes a change in the browser address bar. This is in JSP/Servlet world more formally known as "redirecting" (although most starters initially confuse it with "forwarding"). This is done by HttpServletResponse#sendRedirect():

response.sendRedirect("another-servlet-url");

Basically, the server tells the client by a HTTP 3nn response with a Location header that the client should make a new GET request on the given Location. The above is effectively the same as the following:

response.setStatus(302);
response.setHeader("Location", "another-servlet-url");

As it's the client (the webbrowser) who is been instructed to do that job, you see this URL change being reflected back in the browser address bar.


The term "URL rewriting" is also ambiguous. In JSP/Servlet world, "URL rewriting" is the form of appending the session ID to the URL so that cookieless browsers can still maintain a session with the server. You'll probably ever have seen a ;jsessionid=somehexvalue attribute in the URL. This is by default not done automatically, but most Servlet based MVC frameworks will do it automatically. This is done by HttpServletResponse#encodeURL() or encodeRedirectURL():

String encodedURL = response.encodeURL(url); // or response.encodeRedirectURL(url)
// Then use this URL in links in JSP or response.sendRedirect().

(Which in turn is -again- an ambiguous term. With "URL encoding" you'd normally think of percent encoding. There's no Servlet API provided facility for this, this is normally to be done by URLEncoder#encode() or, MVC-technically more correct, in the JSP by JSTL's <c:url> and <c:param> or any UI component provided by the servlet-based MVC framework, such as JSF's <h:outputLink>)

In general web development world (especially with Apache HTTPD / PHP folks), "URL rewriting" is more known as whatever Apache HTTPD's mod_rewrite is doing: mapping incoming URLs to the concrete resources without reflecting the URL change in the client side. In JSP/Servlet world this is also possible and it's usually done by a Filter implementation which uses RequestDispatcher#forward(). A well known implementation is the Tuckey's URLRewriteFilter.


I admit that this has also confused me for long when I just started with JSP/Servlet, for sure while having my roots in the Apache HTTPD / PHP world.

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
2

Rewriting is a layer (often before your servlet) that causes a URL to be handled like a different URL by modifying the URL before the request is served. The servlet responds through a single request as if the rewritten URL was requested, usually having never known the rewrite occured.

Forwarding (or redirection) is performed by the browser (typically automatically) when instructed by the server via some 3xx error codes (when redirection is allowed by the client). In this case two requests would be served (not necessarily both from your servlet); the first responding with an error code and a URL to redirect to, and the second serving the proper request after the client redirects.

Mark Peters
  • 80,126
  • 17
  • 159
  • 190
  • 3
    Your answer about Forwarding applies to Redirect and not Forward. – ace Oct 31 '11 at 01:01
  • 1
    @ace: Look at the first sentence of the article I posted: *URL redirection, also called URL forwarding...* They are the same concept. If that's not what you mean by forwarding, you really need to clarify what arbitrary definition of "forwarding" you're referring to. – Mark Peters Oct 31 '11 at 01:04
  • Mark, I'm not sure if you've read my answer as well, but I recommend you to read it as well to cleanup your apparent confusion on the concrete question. You namely seem not really ever have worked closely with JSP/Servlets. – BalusC Oct 31 '11 at 19:45
  • @Balus: I read and upvoted your answer a long while ago. You answered hours after the OP clarified what he meant by URL forwarding. While it might have a *second* meaning when dealing with a servlet class itself, URL forwarding as I described it (and you did too as part of your answer) is still very relevant in the context of servlets and I answered as such, with an emphasis on where the servlet fits in. I don't believe my answer to have been an unreasonable interpretation of the question [as it was originally asked](http://stackoverflow.com/posts/7949034/revisions). – Mark Peters Oct 31 '11 at 20:26