当前位置: 首页 > news >正文

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

相关文章:

  • mac meta键是什么
  • redis列表列出所有
  • sismember缩写
  • scard缩写
  • zrevrange缩写
  • 农业银行查询开户支行的方法
  • 深入剖析Tomcat 中英文 文字pdf+源代码
  • 正则表达式 匹配32位字符
  • 谷歌浏览器安装代理插件后Fiddler无法监听到
  • 只能采用某个特定的被适配类 解释
  • Shenandoah收集器三个并发阶段工作过程图
  • 易语言显示js时间格式
  • Cannot resolve MVC view
  • ZooKeeper安装和配置 for Mac
  • ContextLoaderListener的作用是什么
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • JavaScript标准库系列——Math对象和Date对象(二)
  • js中的正则表达式入门
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Xmanager 远程桌面 CentOS 7
  • zookeeper系列(七)实战分布式命名服务
  • 关于 Cirru Editor 存储格式
  • 开发基于以太坊智能合约的DApp
  • 实习面试笔记
  • 赢得Docker挑战最佳实践
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #微信小程序(布局、渲染层基础知识)
  • (2)STM32单片机上位机
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)Oracle存储过程编写经验和优化措施
  • ../depcomp: line 571: exec: g++: not found
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net MVC中使用angularJs刷新页面数据列表
  • .net连接MySQL的方法
  • /bin/rm: 参数列表过长"的解决办法
  • @angular/cli项目构建--Dynamic.Form
  • @vue/cli 3.x+引入jQuery
  • [BZOJ3211]:花神游历各国(小清新线段树)
  • [C++] 统计程序耗时
  • [emacs] CUA的矩形块操作很给力啊
  • [flume$2]记录一个写自定义Flume拦截器遇到的错误
  • [Gym-102091E] How Many Groups
  • [HTML]Web前端开发技术6(HTML5、CSS3、JavaScript )DIV与SPAN,盒模型,Overflow——喵喵画网页
  • [InnoDB系列] -- SHOW INNODB STATUS 探秘
  • [LeetCode]—Longest Palindromic Substring 最长回文子串
  • [mysql]游标和触发器
  • [PHP] 算法-字符串的左循环的PHP实现
  • [Rust学习:二]变量和传参