Search code examples
springweb.xml

How to redirect any url that do not match any @RequestMapping parameter in the application


I use Spring MVC in my web application. I am trying to redirect any url that match the pattern http://localhost:8080/my-app/* to a specific controller. But if the url is something like the following, http://localhost:8080/my-app/test and if there is a controller as follows:

@Controller @RequestMapping("test") public class TestClass {

    @RequestMapping(value = "/landing", method = RequestMethod.GET)
    public String selectHomePage(ModelMap model)
        {
        //do something
        }


    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public String listFaqCollections(@ModelAttribute("ownedby") String ownedBy, ModelMap model)
    {
    //do something
    }
}

And I have another class as follows:

@Controller
    public class InvalidUrslRedirect
    {
    @RequestMapping(method = RequestMethod.GET) 
    public String redirectInvalidUrls(Model model)
    { 
        //do something 
    }

All the urls that are invalid will be redirected to the above controller class.

The valid urls would be as follows:

http://localhost:8080/my-app/test/landing
http://localhost:8080/my-app/test/list?ownedby=me

But if the url is something like:

http://localhost:8080/my-app/test/list?ownedbys=me

the normal tomcat 404 error page is displayed and the it is not getting redirected to the InvalidUrslRedirect class

In my web.xml file, I have the following:

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/core/root-context.xml, classpath:spring/core/spring-security.xml</param-value>
    </context-param>
    <listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
    </listener>

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

In the spring-security.xml, I have:

<http auto-config="true" use-expressions="true">
<intercept-url pattern="/**" access="isFullyAuthenticated()"/>

I have been searching the net for some time now, but could not find much help. is there any way i can achieve such a functionality. Thanks in advance


Solution

  • If i understood you correctly, you want to redirect every request other than e.g. "/test". In this case you'll need two methods:

    @RequestMapping(method = RequestMethod.GET)
    public String redirectEverythingOtherThanTest(){
    return "redirect:/pageToRedirectTo.html"
    }
    
    @RequestMapping(value="/test", method = RequestMethod.GET)
    public String testRequest(){
    //some stuff
    return "somepage.html";
    }
    

    Also remember about @Controller annotation on your class.