Spring MVC - Redirecting to another URL without a controller

[Updated: Jul 24, 2017, Created: Feb 20, 2017]

In the last tutorial we saw how to use ViewControllerRegistry during configuration time to map a url directly to a view. Here we are going to understand another feature of ViewControllerRegistry, that is, how to redirect one URL to another URL directly without using a @Controller.

Note that Spring also supports URL redirection from @Controller method by using RedirectView or by returning 'redirect:' prefix. If not already familiar with URL redirection, we suggest to check out Basics of URL redirection and URL redirection in Java Servlet tutorials.


The configuration class

public class Main extends WebMvcConfigurerAdapter {

  public void addViewControllers (ViewControllerRegistry registry) {
      RedirectViewControllerRegistration r =
                registry.addRedirectViewController("/test", "/test2");

  public static void main (String[] args) {
      SpringApplication.run(Main.class, args);

In above configuration, we are redirecting '/test' to '/test2'. To handle /test2, we are going to map it to a controller method.

The Controller handling /test2

public class MyController {

  private String handleRequest () {
      return "response from controller";

Spring Boot properties


spring.mvc.view.prefix= /WEB-INF/pages/
spring.mvc.view.suffix= .jsp
server.contextPath= /example

Running web application

mvn spring-boot:run


Enter URL http://localhost:8080/test:

In chrome browser, Developer tools > Network tab:

Changing default status code of 302

As seen in above output, the response for '/test' returns status code 302 along with Location header specifying new redirect URL. We can change the default 302 status code by using method RedirectViewControllerRegistration #setStatusCode(..):

    public void addViewControllers (ViewControllerRegistry registry) {
        RedirectViewControllerRegistration r =
                  registry.addRedirectViewController("/test", "/test2");

Above code will set the status code to 303 (See Other). If the status code is not of the standard redirect codes (3xx), an exception will be thrown during startup time:

Caused by: java.lang.IllegalArgumentException: Not a redirect status code.
	at org.springframework.util.Assert.isTrue(Assert.java:68)
	at org.springframework.web.servlet.config.annotation.RedirectViewControllerRegistration.setStatusCode(RedirectViewControllerRegistration.java:57)

Resolving URL relative to root context

The flag set by RedirectViewControllerRegistration #setContextRelative(boolean) is used to resolve the provided redirect URI. If true, all URI will be resolved relative to the current ServletContext. By default it's set to true. Note that similar flag is set with RedirectView instance, but there it's false by default. We would probably never want to set this flag to false, because resolving URI relative to application context root is a very convenient way to go.

Passing query parameters to the redirected resource

By using the method RedirectViewControllerRegistration #setKeepQueryParams(boolean), we can specify whether the query parameters should be repeated with the redirected destination. By default it's false that means if we send query parameters with the original URI '/test' (e.g. '/test?param=paramValue'), they won't be carried over to the destination URI '/test2' unless we set this flag to true.

Example Project

Dependencies and Technologies Used :

  • spring-boot-starter-web 1.4.4.RELEASE: Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container.
    Corresponding Spring version: 4.3.6.RELEASE
  • tomcat-embed-jasper 8.5.11: Core Tomcat implementation.
  • JDK 1.8
  • Maven 3.3.9

Url To Url Redirect Example Select All Download
  • url-redirect-without-controller
    • src
      • main
        • java
          • com
            • logicbig
              • example
        • resources
        • webapp
          • WEB-INF
            • pages

See Also