struts1防止重复提交

news/2024/7/10 23:02:39 标签: Struts, Apache, HTML, Blog

 

 

原理:

 

Struts的Token机制能够很好的解决表单重复提交的问题,基本原理是:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。

这时其实也就是两点,第一:你需要在请求中有这个令牌值,请求中的令牌值如何保存,其实就和我们平时在页面中保存一些信息是一样的,通过隐藏字段来保存,保存的形式如:〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉,这个value是TokenProcessor类中的generateToken()获得的,是根据当前用户的session id和当前时间的long值来计算的。第二:在客户端提交后,我们要根据判断在请求中包含的值是否和服务器的令牌一致,因为服务器每次提交都会生成新的Token,所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。

 

源文档 <http://ww1.blog.enorth.com.cn/article/13871.shtml>

 

 

步骤:

1.在用户通过Action到达表单提交页面的时候,首先在这个action中调用一下 this.saveToken(request);

2.在用户提交表单时候传入一个隐藏域 ,跟随表单一起提交

<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value='<%=session.getAttribute("org.apache.struts.action.TOKEN")%>' />

3.在处理用户提交请求的action

 

          HttpSession session = req.getSession();

String token = req.getParameter("org.apache.struts.taglib.html.TOKEN");

String token2 = (String) session.getAttribute(org.apache.struts.Globals.TRANSACTION_TOKEN_KEY);

System.out.println("token:"+token);

System.out.println("token2:"+token2);

 

session.removeAttribute(Globals.TRANSACTION_TOKEN_KEY);

if (StringUtils.isNotBlank(token) && token.equals(token2))

{

req.setAttribute("message", "成功提交!");

return mapping.findForward("success");

}

req.setAttribute("message", "重复提交!");

return mapping.findForward("error");


http://www.niftyadmin.cn/n/594875.html

相关文章

mysql事务死锁_MySQL事务-死锁

一、概念&#xff1a;多个事务在同一资源上互相占用形成回路。这就是死锁基本命令&#xff1a;#查看是否自动提交事务show variables like %autocommit%;#设置事务是否自动提交set autocommit0;set autocommit1;二、例子&#xff1a;CREATE TABLE user (id bigint(20) NOT NULL…

java 对象运算符,Java基础之运算符——对象赋值

猜猜下面代码中第三行输出的t2.level是多少呢&#xff1f;public class Tank {private int level;public static void main(String[] args) {Tank t1 new Tank();Tank t2 new Tank();t1.level 9;t2.level 19;System.out.println("t1.level" t1.level ",t2…

【iOS 小技巧】Xcode自定义文件头部注释

前言 Xcode 在创建文件时&#xff0c;会默认生成 头部注释&#xff0c;不过这些基础的注释往往不能满足我们的需求&#xff0c;而一个文件一个文件去改&#xff0c;那可不是我们攻城狮改做的事?。 接下来&#xff0c;我们将利用 Xcode 9的新特性&#xff1a;自定义文本宏&…

mysql57和mysql8_MySQL 5.7和8.0性能测试

背景测试mysql5.7和mysql8.0 分别在读写、只读、只写模式下不同并发时的性能(tps&#xff0c;qps)前提测试使用版本为mysql5.7.22和mysql8.0.15sysbench测试前先重启mysql服务&#xff0c;并清空os的cache(避免多次测试时命中缓存)每次进行测试都是新生成测试数据后再进行mysql…

boxplot图怎么画matlab,最有效的绘制分组boxplot matlab的方法

一个双线方法(虽然如果你想保留两行xlables并将它们放在第一行中,那将是hackish)&#xff1a;Y rand(1000,1);X Y-rand(1000,1);ACTid randi(6,1000,1);xylabel repmat(xy,1000,1);boxplot([X; Y], {repmat(ACTid,2,1), xylabel(:)} ,factorgap,10)结果&#xff1a;编辑以标…

matlab plot 多曲线,科学网—【Matlab】如何用plotyy对应坐标绘制多条曲线 - 叶瑞杰的博文...

例子&#xff1a;设x1:0.01:100;y10.2*sin(x);y20.3*sin(x);y30.4*sin(x);y40.5*sin(x);y50.6*sin(x);以左边坐标轴为参考画一条曲线&#xff0c;以右边坐标轴画四条曲线&#xff1a;figure;[AX,h1,h2]plotyy(x,y1,x,[y2;y3;y4;y5]); %用分号还是逗号视y矩阵而定&#xff0c…

mysql session变量_mysql 系统变量和session变量

mysql系统变量包括全局变量(global)和会话变量(session)&#xff0c;global变量对所有session生效&#xff0c;session变量包括global变量。mysql调优必然会涉及这些系统变量的调整&#xff0c;所以我们首先得会查询系统变量。1、 查询全局变量&#xff1a;show global variabl…

matlab中实心圆点,matlab曲线圆圈实心

二维图形 三维图形 图形处理 特殊二、三维图形 实例 1.曲线图 Matlab作图是通过描点、连线来实现的,故在 画一个曲线图形之前,必须先取得该图形上的一系 列的......并给出了 参考程序和运行结果二 关键词:圆度;优化;摄t4,X域圆;/l,J,--乘圆;最小外接圆;最大内接圆;MATLAB 在GB7…