在写网站的登录与注册时最容易出现的就是表单重复提交问题,那么表单重复提交的原因是什么?
@PostMapping("/login")
public String main(User user, HttpSession session, Model model){ //RedirectAttributes
if(StringUtils.hasLength(user.getUserName()) && "123456".equals(user.getPassword())){
//把登陆成功的用户保存起来
session.setAttribute("loginUser",user);
return "main";
}else {
model.addAttribute("msg","账号密码错误");
//回到登录页面
return "login";
}
看上面的登录代码,当账号密码验证通过时会return “main”;
那么return “main”;的真正含义是什么,在springboot中,return "main"的意义就是转发到main.html页面,那么我们浏览器此时的访问的地址就是localhost:端口号/login,当我们点击刷新时访问的还是这个地址,那么就会造成表单重复提交。
如何解决
@PostMapping("/login")
public String main(User user, HttpSession session, Model model){ //RedirectAttributes
if(StringUtils.hasLength(user.getUserName()) && "123456".equals(user.getPassword())){
//把登陆成功的用户保存起来
session.setAttribute("loginUser",user);
//登录成功重定向到main.html; 重定向防止表单重复提交
return "redirect:/main.html";
}else {
model.addAttribute("msg","账号密码错误");
//回到登录页面
return "login";
}
}
/**
* 去main页面
* @return
*/
@GetMapping("/main.html")
public String mainPage(HttpSession session,Model model){
log.info("当前方法是:{}","mainPage");
return "main";
}
}
如上代码,在判断账号密码成功后重定向到"main.html",我们知道重定向与转发的不同是转发时请求的地址不会发生变化,就如上面我们访问localhost:端口号/login这个地址,然后转发到main.html,此时地址栏的地址还是localhost:端口号/login,而当我们重定向到main.html这个接口是,地址就变成了localhost:端口号/main.html。那么当我们点击刷新时,就访问的是这个重定向的地址,而不会访问localhost:端口号/login进行表单重复提交。