diff --git a/spring-rest/README.md b/spring-rest/README.md
index 5e0a62c3eb..3231d65625 100644
--- a/spring-rest/README.md
+++ b/spring-rest/README.md
@@ -6,4 +6,4 @@
### Relevant Articles:
- [Spring @RequestMapping](http://www.baeldung.com/spring-requestmapping)
- [Http Message Converters with the Spring Framework](http://www.baeldung.com/spring-httpmessageconverter-rest)
-
+- [Redirect in Spring](http://www.baeldung.com/spring-redirect)
diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml
index fce9a5699f..f04d04e8ec 100644
--- a/spring-rest/pom.xml
+++ b/spring-rest/pom.xml
@@ -153,6 +153,12 @@
test
+
+ org.springframework
+ spring-test
+ ${spring.version}
+
+
diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java b/spring-rest/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java
new file mode 100644
index 0000000000..472c0c8bf5
--- /dev/null
+++ b/spring-rest/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java
@@ -0,0 +1,52 @@
+package org.baeldung.web.controller.redirect;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+import org.springframework.web.servlet.view.RedirectView;
+
+@Controller
+@RequestMapping("/")
+public class RedirectController {
+
+ @RequestMapping(value = "/redirectWithXMLConfig", method = RequestMethod.GET)
+ public ModelAndView redirectWithUsingXMLConfig(final ModelMap model) {
+ model.addAttribute("attribute", "redirectWithXMLConfig");
+ return new ModelAndView("RedirectedUrl", model);
+ }
+
+ @RequestMapping(value = "/redirectWithRedirectPrefix", method = RequestMethod.GET)
+ public ModelAndView redirectWithUsingRedirectPrefix(final ModelMap model) {
+ model.addAttribute("attribute", "redirectWithRedirectPrefix");
+ return new ModelAndView("redirect:/redirectedUrl", model);
+ }
+
+ @RequestMapping(value = "/redirectWithRedirectAttributes", method = RequestMethod.GET)
+ public RedirectView redirectWithRedirectAttributes(final RedirectAttributes redirectAttributes) {
+ redirectAttributes.addFlashAttribute("flashAttribute", "redirectWithRedirectAttributes");
+ redirectAttributes.addAttribute("attribute", "redirectWithRedirectAttributes");
+ return new RedirectView("redirectedUrl");
+ }
+
+ @RequestMapping(value = "/redirectWithRedirectView", method = RequestMethod.GET)
+ public RedirectView redirectWithUsingRedirectView(final ModelMap model) {
+ model.addAttribute("attribute", "redirectWithRedirectView");
+ return new RedirectView("redirectedUrl");
+ }
+
+ @RequestMapping(value = "/forwardWithForwardPrefix", method = RequestMethod.GET)
+ public ModelAndView forwardWithUsingForwardPrefix(final ModelMap model) {
+ model.addAttribute("attribute", "redirectWithForwardPrefix");
+ return new ModelAndView("forward:/redirectedUrl", model);
+ }
+
+ @RequestMapping(value = "/redirectedUrl", method = RequestMethod.GET)
+ public ModelAndView redirection(final ModelMap model, @ModelAttribute("flashAttribute") final Object flashAttribute) {
+ model.addAttribute("redirectionAttribute", flashAttribute);
+ return new ModelAndView("redirection", model);
+ }
+}
\ No newline at end of file
diff --git a/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml b/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml
index acab871c88..5afc637ece 100644
--- a/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml
+++ b/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml
@@ -1,16 +1,33 @@
-
+
-
+
+
+
+
+
+
+
+ /WEB-INF/spring-views.xml
+
+
+
+
+
-
+
-
+
-
-
\ No newline at end of file
+
+
+
+
+
diff --git a/spring-rest/src/main/webapp/WEB-INF/spring-views.xml b/spring-rest/src/main/webapp/WEB-INF/spring-views.xml
new file mode 100644
index 0000000000..2944828d6d
--- /dev/null
+++ b/spring-rest/src/main/webapp/WEB-INF/spring-views.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-rest/src/main/webapp/WEB-INF/web.xml b/spring-rest/src/main/webapp/WEB-INF/web.xml
index 935beae648..01e7620c44 100644
--- a/spring-rest/src/main/webapp/WEB-INF/web.xml
+++ b/spring-rest/src/main/webapp/WEB-INF/web.xml
@@ -38,4 +38,4 @@
-
\ No newline at end of file
+
diff --git a/spring-rest/src/test/java/org/baeldung/web/controller/redirect/RedirectControllerTest.java b/spring-rest/src/test/java/org/baeldung/web/controller/redirect/RedirectControllerTest.java
new file mode 100644
index 0000000000..ab2b9f3f87
--- /dev/null
+++ b/spring-rest/src/test/java/org/baeldung/web/controller/redirect/RedirectControllerTest.java
@@ -0,0 +1,67 @@
+package org.baeldung.web.controller.redirect;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.flash;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
+import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.web.context.WebApplicationContext;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("file:src/main/webapp/WEB-INF/api-servlet.xml")
+@WebAppConfiguration
+public class RedirectControllerTest {
+
+ private MockMvc mockMvc;
+
+ @Autowired
+ protected WebApplicationContext wac;
+
+ @Before
+ public void setup() {
+ mockMvc = webAppContextSetup(wac).build();
+ }
+
+ @Test
+ public void whenRedirectOnUrlWithUsingXMLConfig_thenStatusRedirectionAndRedirectedOnUrl() throws Exception {
+ mockMvc.perform(get("/redirectWithXMLConfig")).andExpect(status().is3xxRedirection()).andExpect(view().name("RedirectedUrl")).andExpect(model().attribute("attribute", is("redirectWithXMLConfig")))
+ .andExpect(redirectedUrl("redirectedUrl?attribute=redirectWithXMLConfig"));
+ }
+
+ @Test
+ public void whenRedirectOnUrlWithUsingRedirectPrefix_thenStatusRedirectionAndRedirectedOnUrl() throws Exception {
+ mockMvc.perform(get("/redirectWithRedirectPrefix")).andExpect(status().is3xxRedirection()).andExpect(view().name("redirect:/redirectedUrl")).andExpect(model().attribute("attribute", is("redirectWithRedirectPrefix")))
+ .andExpect(redirectedUrl("/redirectedUrl?attribute=redirectWithRedirectPrefix"));
+ }
+
+ @Test
+ public void whenRedirectOnUrlWithUsingRedirectAttributes_thenStatusRedirectionAndRedirectedOnUrlAndAddedAttributeToFlashScope() throws Exception {
+ mockMvc.perform(get("/redirectWithRedirectAttributes")).andExpect(status().is3xxRedirection()).andExpect(flash().attribute("flashAttribute", is("redirectWithRedirectAttributes")))
+ .andExpect(model().attribute("attribute", is("redirectWithRedirectAttributes"))).andExpect(model().attribute("flashAttribute", is(nullValue()))).andExpect(redirectedUrl("redirectedUrl?attribute=redirectWithRedirectAttributes"));
+ }
+
+ @Test
+ public void whenRedirectOnUrlWithUsingRedirectView_thenStatusRedirectionAndRedirectedOnUrlAndAddedAttributeToFlashScope() throws Exception {
+ mockMvc.perform(get("/redirectWithRedirectView")).andExpect(status().is3xxRedirection()).andExpect(model().attribute("attribute", is("redirectWithRedirectView"))).andExpect(redirectedUrl("redirectedUrl?attribute=redirectWithRedirectView"));
+ }
+
+ @Test
+ public void whenRedirectOnUrlWithUsingForwardPrefix_thenStatusOkAndForwardedOnUrl() throws Exception {
+ mockMvc.perform(get("/forwardWithForwardPrefix")).andExpect(status().isOk()).andExpect(view().name("forward:/redirectedUrl")).andExpect(model().attribute("attribute", is("redirectWithForwardPrefix"))).andExpect(forwardedUrl("/redirectedUrl"));
+ }
+
+}