Spring MVC 重定向和转发

版权声明:本文为博主原创文章,用来记录学习过程,欢迎交流学习。 https://blog.csdn.net/k_young1997/article/details/88846872

写一个商城的项目,需要在跳转的时候实现一些需求,通过查看资料总结一下。

1、通过return 字符串的方式映射到目标controller

这种方式是浏览器给服务器发一个response,服务器接收后向浏览器回复一个request,所以最后在浏览器显示的url是你请求时的url,对应下边的"/login_check"。

@RequestMapping("/login_check")
	public String login() {
		return "/login";
	}

如果需要传递参数给浏览器的话可以用Model

@RequestMapping("/login_check")
	public String login(Model model) {
		model.addAttribute("参数名", "参数值");
		return "/login";
	}

2、通过return "redirect:xxx"的方式映射到目标controller

这种方式是浏览器向服务器发送一个response,请求的是/login_check,服务器向浏览器回复一个request,然后浏览器再次向服务器发送一个response,请求的是/login,服务器再次向其回复一个request,所以,最后url显示的是你要重定向的url,也就是下边的/login

@RequestMapping("/login_check")
	public String login() {
		return "redirect:/login";
	}

所以采用这种方式重定向的话,如果跟上一种方式一样用Model传递参数的话是无法通过request.getAttribute()的方式来获取参数的。这里推荐使用拦截器(Interceptor)+ThreadLocal的方式来传递参数(我在验证用户登录时通过将ticket添加到cookie的,然后通过这种方式判断)

3、通过forward的方式映射到controller

forward 的转发过程只发生在服务端。Servlet 容器会直接把源请求打向目标 URL,而不会经由客户端发起请求,因此客户端接收到的响应是来自转发后的目标方法,但是浏览器呈现的 URL 却并不会改变,且 forward 不能将参数转发出去。

@RequestMapping("/login_check")
	public String login(RedirectAttributes attrs) {
		attrs.addAttribute("参数名", "参数值");  
		return "forward:/login";
	}

4、通过RedirectAttributes的方式将参数传递到目标controller

这种方式是通过GET的方式的,在跳转后url会变为/login?参数名=参数值的形式

@RequestMapping("/login_check")
	public String login(RedirectAttributes attrs) {
		attrs.addAttribute("参数名", "参数值");  
		return "/login";
	}

猜你喜欢

转载自blog.csdn.net/k_young1997/article/details/88846872