博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于struts2防止表单重复提交
阅读量:6923 次
发布时间:2019-06-27

本文共 2789 字,大约阅读时间需要 9 分钟。

struts2防表单重复提交有两种方式。

其一是action的重定向,跳转时设置type为从一个action跳转到另一个action或者另一个页面,

使用户提交后,所停留的位置,不是当前处理数据的Action,这样用户再刷新时,就不会再次执行这个Action了,

就会避免表单重复提交的问题了。

其二就是session令牌的方式(token)

处理也很方便,只需要在所提交的表单上加一个struts2标签  <s:token>

注意在该页面需要导入  <%@taglib prefix="s" uri="/struts-tags"%>

这样,当浏览器第一次访问这个带有<s:token>标签的页面时,在服务器中,解析<s:token>标签的类(TokenTag.class),

会生成一个随机的字符串(这个字符串,查看网页的源代码可以看到),并且发送给客户端的浏览器,同时,在服务器中,

会把这个随机字符串保存到用户的session对象中。

当第一次提交表单时,在服务器中,会比较客户端和服务器中分别保存的这个随机字符串,因为是第一次提交,

所以这两个字符串相等,然后进行正常的业务处理。第一次提交后,在服务器中的session中保存的这个随机字符串,

会改变为其他的随机值,注意,这是很重要的一步!此时,地址栏停留在处理用户提交数据的Action中,

客户端中保存的随机字符串没有改变,若是刷新页面,即重复提交,服务器再进行两个字符串的比较,

会不相等,就会跳转到name为invalid.token的结果页面中,这样就会防止表单重复提交了。

贴上示例代码

struts_regist.jsp

1 <%@ taglib prefix="s" uri="/struts-tags" %> 2 <%-- 3   Created by IntelliJ IDEA. 4   User: leslie 5   Date: 17-12-2 6   Time: 上午10:46 7   To change this template use File | Settings | File Templates. 8 --%> 9 <%@ page contentType="text/html;charset=UTF-8" language="java" %>10 11 12     注册13 14 15     
16
17 用户名:
18 密    码:
19
20
21 22

struts.xml

1 
2 5 6
7
8
9
/token.jsp
10
11
12
13
14

token.jsp

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib prefix="s" uri="/struts-tags"%> 3  4  5    6     My JSP 'index.jsp' starting page 7    8  9   10     
11 12

 

RegistAction

1 package com.emuii.action; 2  3 import com.opensymphony.xwork2.ActionSupport; 4 import org.apache.struts2.ServletActionContext; 5  6 public class RegistAction extends ActionSupport { 7  8     @Override 9     public String execute() throws Exception {10 11        String name = ServletActionContext.getRequest().getParameter("name");12        String password = ServletActionContext.getRequest().getParameter("password");13 14        System.out.println(name+":"+password+"已注册");15 16        return null;17     }18 }

如果想要自定义错误信息,只需在action同一目录下创建一个 ----类名.properties配置文件即可

RegistAction.properties

1 struts.messages.invalid.token=\u60A8\u5DF2\u7ECF\u91CD\u590D\u63D0\u4EA4\u8868\u5355\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5

另:对于只有一个action来说,通配符跳转的方式第一种防表单提交无效的,虽然重定向之后的jsp页面不一样。

如果需要对特定的方法进行防表单提交这样:

1 
2
3
myMethod4
5
6
good_result.ftl
7

<param name="includeMethod">xx</param>表示只拦截xx方法

<param name="excludeMethod">xx</param>表示拦截xx方法之外的方法

另:WARN [org.apache.struts2.util.TokenHelper] - Could not find token name in params.出现这个问题,

也有可能是你没对指定方法进行拦截,当然情况不一定非是这种的,只是因为我的项目问题才导致这个问题的。

转载于:https://www.cnblogs.com/lesliehe/p/7989560.html

你可能感兴趣的文章
我的友情链接
查看>>
XCode快捷键
查看>>
zookeeper错误:KeeperErrorCode = NoChildrenForEphemerals的原因
查看>>
istio-0.8 路由权重设置
查看>>
springmvc数据绑定
查看>>
安装yii2
查看>>
LVS负载均衡之session解决方案 持久连接
查看>>
在商业计算中我们要用java.math.BigDecimal
查看>>
Android基于XMPP Smack Openfire下学习开发IM(五)连接断开重连
查看>>
网络瘫痪分析处理(午饭的一个例子)
查看>>
cisco3750交换机物理端口配置IP地址
查看>>
数据库查询性能需注意几点
查看>>
6 个重构方法可帮你提升 80% 的代码质量
查看>>
[转载]JQUERY的父,子,兄弟节点查找方法
查看>>
10.23 linux任务计划cron 10.24 chkconfig工具 10.25 system
查看>>
正式教你控制win7的任务管理器显示的内容
查看>>
linux--mkfs-tune2fs-mount笔记@1
查看>>
CDN的实现原理
查看>>
lamp环境下论坛的实现
查看>>
Hibernate对象3种状态转变关系
查看>>