转发发生在服务端,重定向发生在客户端
Spring MVC 转发和重定向
1. 常规用法,返回一个view
这种十分常见,我们在Controller中处理相关数据之后会直接返回到对应的页面,将数据直接放在Model中然后直接返回字符串,然后经过视图解析器进行解析映射到对应的页面
@RequestMapping("/login")
public String login(@RequestParam String username,
@RequestParam String password,
Model model){
System.out.println(username);
System.out.println(password);
model.setAttribute ("username",username);
model.setAttribute("password",password);
return "admin";
}
在这里只是一次请求,发送/login请求,然后根据返回的字符串去查找相应的页面进行渲染
但是为什么放在session里的数据会失效?
2. springmvc请求重定向
有些时候我们需要在Controller中处理完数据之后,需要跳转到另一个Controller中进行相关操作,这个时候可以用请求转发和请求重定向
2.1 重定向
一个web资源收到客户端请求后,通知客户端(浏览器)去访问另外一个web资源,这称之为请求重定向。
是两次请求,浏览器地址栏会发生变化

基本使用
@PostMapping("/login")
public String login(@RequestParam String username,
@RequestParam String password,
RedirectAttributes redirectAttributes){
System.out.println(username);
System.out.println(password);
User user = userService.checkUser(username, password);
if(user!=null){
user.setPassword(null);
session.setAttribute("user",user);
System.out.println("true");
return "adminindex";
}else {
redirectAttributes.addFlashAttribute("message","用户名或密码错误");
return "redirect:/admin";
}
}
对于重定向时传递参数可以使用modelAndView来传递参数或者直接拼接Url进行带参重定向跳转,但是传递的参数会直接暴露在浏览器的链接地址上
return "redirect:/redirectController/redirectTest?name"+"aiqinhai"
所以通常是使用RedirectAttributes来进行重定向传参
redirectAttributes.addFlashAttribute("message","用户名或密码错误");
return "redirect:/admin";
session数据丢失
重定向是让浏览器发送新的请求到另一个controller进行执行,所以浏览器的地址会变化
2.2 请求转发
指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理

一次请求,地址栏不会变,Request是共享的
正是因为地址不会变化,所以表单提交后刷新页面会出现重复提交的现象
@RequestMapping(value="/testa", method=RequestMethod.GET)
public String inputData(){
return "testa"; //Spring框架找到对应的View并渲染
}
@RequestMapping(value="/testa", method=RequestMethod.POST)
public String outputData(HttpServletRequest request){
String userName = request.getParameter("name");
String password = request.getParameter("pwd");
request.setAttribute("name", userName);
request.setAttribute("pwd", password);
//转发到 /testb 的Controller方法(即outputDataX)上
return "forward:/testb";
}
@RequestMapping(value="/testb", method=RequestMethod.POST)
public String outputDataX(HttpServletRequest request){
return "testb";
}
打开testa网页:

输入用户名:spring,密码:spring:

点击登陆按钮,页面变为如下,浏览器的URL不变。

再次刷新,谷歌浏览器提示重新提交表单。

本文详细介绍了SpringMVC中的转发和重定向概念及应用。转发发生在服务端,用于内部资源之间的调用,地址栏不变;重定向发生在客户端,涉及两次请求,地址栏会更新。文章通过实例代码对比了两者的不同,包括数据处理、参数传递和session数据的处理。
1056





