Spring_Boot专栏 | ||
---|---|---|
上一篇 | 主目录 | 下一篇 |
【前言】
重定向可以解决表单重复提交的问题。重定向和分发都是返回一个请求,再由视图解析器去解析这个请求映射到某个视图,而不是像普通的返回那样进行拼串:classpath:/templates/返回的字符串.html
.在controller里,当当前方法处理完某个请求后需要再发出另一个请求,而不是经过模板引擎的解析映射到某个视图页面的时候,重定向和分发就起到了作用。
1.重定向的作用
在登录界面直接由控制器返回dashboard.html时,刷新页面会有重复提交表单的问题。因为在这个页面进行刷新,给服务器发送的请求是上一次在登陆页面的相同的请求。通过重定向来到新页面刷新就不会出现重复提交的问题。
2.重定向的方法
<form class="form-signin" action="dashboard.html" th:action="@{/user/login}" method="post">
表单是以post方式提交/user/login请求,在登录控制器LoginController.class里面有相应的处理方法(@PostMapping(value = “/user/login”)):
@Controller
public class LoginController {
//@GetMapping
//@RequestMapping(value = "/user/login", mathod= RequestMethod.POST)
@PostMapping(value = "/user/login")
public String login(@RequestParam("username") String username,
@RequestParam("password") String password,
Map<String,Object> map){//map保存错误消息
if(!StringUtils.isEmpty(username)&&"123456".equals(password)){
//登录成功,为防止表单重复提交,可以重定向
return "redirect:/main.html";
}else{
//false
map.put("msg","用户名或密码错误!");
return "login";
}
}
}
这个处理方法重定向一个请求:重定向到当前项目下main.html请求,这个请求由配置类里面的视图映射进行处理:
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/main.html").setViewName("dashboard");
}
}
该视图映射返回dashboard.html页面。
3 分发
return "forward:/rest/queryData"
,实际的效果是在浏览器中的url地址还是原地址,存在重复提交的问题,所以forward就不推荐使用了。