springMVC使用return redirect 而不是 return viewName的作用
场景分析
在添加文章时访问的是Admin/article/insert
页面,在这个可以你可以设置文章的内容、分类、标签等信息。
文章编辑完成后点击提交按钮,请求地址是Admin/article/insertSubmit
,提交完成后希望返回到insert页面从而继续添加新文章。
此时可以在提交完成后,也就是发送完POST请求后 return redirect:/Admin/article/insert
返回insert页面。
作用
使用 redirect方式 而不是直接 return "Admin/article/insert"
是为了防止刷新页面导致的表单重复提交问题。
使用直接return方式而不是重定向的话,提交后页面显示的是insert页面,但是url地址为网站域名+/Admin/article/insertSubmit
,此时刷新导致表单重复提交。
相反,使用redirect重定向的话url地址为网站域名+/Admin/article/insert
,即使刷新也是在insert页面,不会重复提交。
扩展
redirect 是否需要加/斜杠
涉及到绝对路径和相对路径的知识
加上"/" ,也就是redirect:/地址
表示绝对路径,表示contextPath+地址
不加的话,表示相对于当前资源路径
对上面例子来说,因为当前处于Admin/article/insert
页面,所以
return "redirect:insertSubmit"
等于 return "redirect:/Admin/article/insertSubmit"
返回再刷新导致重复提交
表单提交成功以后,直接点击浏览器上回退按钮,不刷新页面,然后点击提交按钮再次提交表单。
根本原因:因为服务器在处理请求时,不会检查是否为重复提交的请求。
解决方案:
<%
String uuid = UUID.randomUUID().toString();
session.setAttribute("uuid", uuid);
%>
<br>${errormsg }<br>
<form action="${pageContext.request.contextPath }/SessionServlet" >
<br>
<input type="text" name="uuid" value="<%=uuid %>"/>
<br> user:
<input type="text" name="username">
<br> password
<input type="password" name="pwd">
<br>
<input type="submit" value="提交" "><br></form>
在servlet页面
String reqUUID = request.getParameter("uuid");
HttpSession session = request.getSession();
String sessUUID = (String) session.getAttribute("uuid");
session.removeAttribute("uuid");
if(reqUUID.equals(sessUUID)){
response.sendRedirect(request.getContextPath()+"/login_success.jsp");
System.out.println("已经插入");
}else{
request.setAttribute("errormsg", "重复登陆");
request.getRequestDispatcher("/3.jsp").forward(request, response);
}
文章参考
- 为啥重定向可以解决表单重复提交问题?_陌路_一步一步往上爬的博客-CSDN博客
https://blog.csdn.net/qq_41649001/article/details/107491939 - springMVC 的请求地址加 斜杠和不加斜杠的区别 - SegmentFault 思否
https://segmentfault.com/q/1010000004934733