2、二是,forward跳转引起的重复提交。在页面跳转的时候,有两种类型:请求转发和重定向,所谓请求转发是在服务器端进行跳转,对用户是透明的,此时浏览器中的地址不会发生改变,重定向是在客户端发生跳转,跳转时候浏览器中的地址栏会发生改变,如果我们在注册时,使用了请求转发,那么当我们刷新页面时,就会引起表单的重复提交
二、解决方案
方案一、使用struts2中的token或者tokenSession
对token的简单理解:
1)当用户首次访问包含表单的页面时,服务器会在这次会话中创建一个session对象,并产生一个令牌值,然后将这个令牌值作为隐藏输入域的值,随表单一起发送到服务器端,同时将令牌值保存到Session中。
2) 当用户提交页面时,服务器首先判断请求参数中的令牌值和Session中保存的令牌值是否相等,若相等,则清楚Session中的令牌值,然后执行数据处 理操作。如果不相等,则提示用户已经提交过了表单,同时产生一个新的令牌值,保存到Session中。当用户重新访问提交数据页面时,将新产生的令牌值作 为隐藏输入域的值。
token: 在活动Action中检查合法令牌(token), 防止表单的重复提交;
token-session: 同上, 但是在接到非法令牌时将提交的数据保存在session中;
主要步骤如下:
第一步:在表单中加入(当然啦!要首先导入struts2的标签库 <%@taglib uri=”/struts-tags” prefix=”s” %>)
第二步:在struts.xml配置文件中相应的action上配置token或者tokenSession。此只能用在有form的提交请求上。
/WEB-INF/page/message.jsp
/WEB-INF/page/result.jsp
以上配置加入了“token”和“invalid.token”结果,因为“token”在会话的token与请求的token不一致时,将会直接返回“invalid.token”结果。
方案二:基于第二种重复提交表单的原因,服务器内部使用重定向
在Struts2中的struts.xml中,result标签的type默认值是 dispatcher,(请求转发),要实现以上的功能,肯定不能使用默认值,我们需要将其值设为redirectAction(重定向到某一 Action),也就是说重一个Action跳转到另外一个Action,此时浏览器中的地址是第二个Action,结合到上面的需求,我们可以再第一个 Action中将记录添加到中,然后在第二个Action中将数据读取出来。以后每次刷新,那么只会执行第二个Action。
到struts-default.xml中找到与redirectionAction对应的一个类,ServletActionRedirectResult
从Api文档中发现找出里面有一个字段叫做actionName,指定我们需要跳转的Action,配置方法如下:vcD4NCjxwcmUgY2xhc3M9"brush:java;">show_show
1、JSP页面:
JSP页面的上传文件的组件:,如果需要一次上传多个文件, 就必须使用多个 file 标签, 但它们的名字必须是相同的,即:name=“xxx”的值必须一样;
2. 必须把表单的enctype属性设置为:multipart/form-data;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-29166-2.html
易烊千玺献声小王子