对于重复提交这一问题我们通常有两种解决方法:
- 通过重定向
- 通过session token
这里我们主要介绍session token机制,下面我们先介绍token的使用步骤吧:
- 首先我们需要用到struts2标签库中的标签元素<s:token/>,如下图所示:
- 编写LoginAction:
- 然后配置struts.xml文件:
成功则跳转到output.jsp进行数据展示,失败则跳转到fail.jsp进行错误消息提示 注:invalid.token是框架规定的名字,专门用来处理重复提交的
- 编写output.jsp、fail.jsp:
这样就可以解决重复提交了
现在我们来介绍一下底层的机制吧:
用struts2标签<s:token/>是为了让服务器在解析jsp的时候调用TokenTag标签处理类,而该处理类用于生成唯一随机值以及将随机值存于session中,然后又将随机值以隐藏域的形式返回给客户端,在这一刻,客户端以及服务器端拥有着相同的随机值,当表单提交到服务器端的时候,会检查这两个值是否相同,如果相同那么认为是第一次提交,并且将session中的随机值更新或删除,然后继续执行后续流程,下一次如果表单仍以之前的随机值提交上来的话,那么服务器就会检查到这两个值不相同,认定是重复提交,转到invalid.token结果中
简而言之就是以服务端与客户端拥有的随机值是否相同来作为重复提交的判断依据