I just announced the new Spring 5 modules in REST With Spring:

>> CHECK OUT THE COURSE

1. Overview

Occasionally, the initial HTTP Request Handler in our Java Servlet needs to delegate the Request to another resource. In these cases, we can either forward the request further or redirect it to a different resource.

We’ll use both mechanisms and discuss differences and best practices of each.

2. Maven Dependencies

First, let’s add the Servlet Maven dependency:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.0</version>
</dependency>

The latest version can be found here.

3. Forward

Let’s now jump right in and have a look at how to do a simple forward:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    RequestDispatcher dispatcher = getServletContext()
      .getRequestDispatcher("/forwarded");
    dispatcher.forward(req, resp);
}

We get hold of RequestDispatcher reference from parent Servlet and point it to another server resource.

Simply put, this will forward the request.

When a client submits a request to http://localhost:8081/hello?name=Dennis, this logic will run and the request will be forwarded to “/forwarded“.

4. Redirect

Now that we understand the concept of forwarding, let’s have a look at a quick snippet for redirecting:

protected void doGet(HttpServletRequest req, HttpServletResponse resp){
    resp.sendRedirect(req.getContextPath() + "/redirected");
}

We use original response object to redirect this request to another URL: “/redirected”.

When a client submits a request to http://localhost:8081/welcome?name=Dennis, the request will be redirected to http://localhost:8081/redirected.

To find out more about doing redirects in the context of Spring, have a look at our dedicated article here.

5. Differences

We passed the parameter “name” with a value in both cases. Simply put, forwarded requests still carry this value, but redirected requests don’t.

This is because, with a redirect, the request object is different from the original one. If we still want use this parameter, we need to save it in the HttpSession object.

Here is a list of major differences between servlet forward and redirect:

Forward:

  • The request will be further processed on the server side
  • The client isn’t impacted by forward, URL in a browser stays the same
  • Request and response objects will remain the same object after forwarding. Request-scope objects will be still available

Redirect:

  • The request is redirected to a different resource
  • The client will see the URL change after the redirect
  • A new request is created
  • Redirect is normally used within Post/Redirect/Get web development pattern

6. Conclusion

Forwarding and redirecting are both about sending a user to different resources, although they have quite different semantics.

Picking between these is simple. If the previous scope is required, or the user doesn’t need to be informed, but the application also wants to perform an internal action then use forwarding.

To discard the scope or if the new content isn’t associated with the original request – such as a redirect to a login page or completing a form submission – then use redirecting.

As always, the example code can be found over on GitHub.

I just announced the new Spring 5 modules in REST With Spring:

>> CHECK OUT THE LESSONS