Nuñito Calzada
Nuñito Calzada

Reputation: 1948

HTTP redirect: 301 (permanent) vs. 302 (temporary) in Spring

I want to make a 301 redirect in Spring, So here the piece of code I use

@RequestMapping(value = { "/devices" } , method = RequestMethod.GET)
    private String initGetForm(@ModelAttribute("searchForm") final SearchForm searchForm,
                            BindingResult result, 
                            HttpServletRequest request,
                            HttpServletResponse response,
                            Model model, Locale locale) throws Exception {


        String newUrl = "/devices/en";

        response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
        response.setHeader("Location", newUrl);
        response.setHeader("Connection", "close");

        return "redirect:" + newUrl;

}

But checking the IE Developer Tools I got this Status 302 Moved Temporarily !

Upvotes: 6

Views: 4870

Answers (2)

Braj
Braj

Reputation: 46871

You can use RedirectView with TEMPORARY_REDIRECT status.

@RequestMapping(value = { "/devices" } , method = RequestMethod.GET)
private ModelAndView initGetForm(@ModelAttribute("searchForm") final SearchForm searchForm,
                            BindingResult result, 
                            HttpServletRequest request,
                            HttpServletResponse response,
                            Model model, Locale locale) throws Exception {
    ....
    RedirectView redirectView = new RedirectView(url);
    redirectView.setStatusCode(HttpStatus.TEMPORARY_REDIRECT);
    return new ModelAndView(redirectView);
}

Upvotes: 6

ekem chitsiga
ekem chitsiga

Reputation: 5753

Spring is resetting your response headers when it handles the redirection since you are returning a logical view name with a special redirect prefix.If you want to manually set the headers handle the response yourself without using Spring view resolution. Change your code as follows

@RequestMapping(value = { "/devices" } , method = RequestMethod.GET)
private void initGetForm(@ModelAttribute("searchForm") final SearchForm searchForm,
                                BindingResult result, 
                                HttpServletRequest request,
                                HttpServletResponse response,
                                Model model, Locale locale) throws Exception {

            String newUrl = request.getContextPath() + "/devices/en";
            response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
            response.setHeader("Location", newUrl);
            response.setHeader("Connection", "close");

    }

Upvotes: 7

Related Questions