extjs+struts2 一个项目中用到了struts2和extjs,现在想实现的功能是用struts2中的Token或Token Session拦截器实现防止重复提交!卡在这儿好几天了,请求各位大侠帮忙! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我原来也做过struts2和extjs框架的j2ee项目开发,不过用struts2来解决关于重复提交的问题,具体不是太清楚,你先在网上查查文档看看!我翻翻原来的项目看看! http://www.javaeye.com/topic/176668刚好书签里保存着的,也许对你有帮助~~ 一、jsp页面:<s:token></s:token> 二、struts.xml 配置需要使用的拦截器 配置重复提交时跳转到的页面 <action name="demo05" class="action.Demo05Action"> <interceptor-ref name="token" /> <interceptor-ref name="defaultStack" /> <result>/jsp/ok.jsp</result> <result name="invalid.token">/jsp/error.jsp</result> </action> 谢谢这位朋友,这个我是知道的!问题是我现在的页面用的是extjs,所以感觉有些难办! 可以参考这个:http://wenku.baidu.com/view/40b00aeb6294dd88d0d26b66.html在页面上的 formpanel 或者 gridpanel 加入一个隐藏域或者用另外的方法: 提交的时候就把按钮变为灰色,form.isDirty() 判断是否更改了form中的数据 可以参考这个:http://wenku.baidu.com/view/40b00aeb6294dd88d0d26b66.html在页面上的 formpanel 或者 gridpanel 加入一个隐藏域或者用另外的方法: 提交的时候就把按钮变为灰色,form.isDirty() 判断是否更改了form中的数据 token-session token 拦截器 struts2.0 it 首先要在jsp的from标签里加入防重复提交标签, 生成如下的内容:(struts.token.name 标识哪个隐藏域存了 token 值) 注意自定义的表单域别重名了。它的作用是防止表单重复提交,每次加载页面 struts.token 的值都不一样,如果两次提交时该值一样,则认为是重复提交。此时要启用 TokenInterceptor(token) 拦截器,最好是也启用 TokenSessionStoreInterceptor(token-session) 拦截器,不然后台会出现错误提示: com.opensymphony.xwork2.interceptor.ParametersInterceptor setParameters 严重: ParametersInterceptor - [setParameters]: Unexpected Exception catched: Error setting struts2使用拦截器来检查表单是否重复提交,它采用同步令牌的方式来实现对表单重复提交的判断。首先需要在表单中使用<s:token name="user.token"></s:token><s:token>标签创建一个新的令牌值,并用你所指定的令牌名把令牌保存到session中。而这个令牌值是随即产生的经过加密的字符序列,不会重复。其次需要为action配置TokenInterceptor或者TokenSessionStoreInterceptor拦截器。这两个拦截器都已经在struts-default.xml中定义,但没有包含在defaultStack拦截器栈中。在action中配置拦截器和在重复提交时,将要请求导向的结果视图。<action name="register" class="com.zhaosoft.action.RegisterAction"> <!-- 配置异常映射,当RegisterAction抛出Exception异常时,向用户显示error.jsp页面 --> <exception-mapping result="error" exception="java.lang.Exception"/><result name="invalid.token">/WEB-INF/pages/register.jsp</result> <result name="input">/WEB-INF/pages/register.jsp</result> <result name="success">/WEB-INF/pages/success.jsp</result> <result name="error">/WEB-INF/pages/error.jsp</result> <interceptor-ref name="defaultStack"> <param name="workflow.excludeMethods">default</param> </interceptor-ref> <interceptor-ref name="token"> <param name="excludeMethods">default</param> </interceptor-ref> </action>注:excludeMethods指定要排除的方法。在register.jsp页面中添加action级别的错误信息显示的标签:<s:actionerror/>在form中添加<s:token>标签:<s:token name="user.token"></s:token>最好为在资源文件中设置键struts.messages.invalid.token的本地化消息。struts.messages.invalid.token=您已经提交了表单,请不要重复提交。TokenSessionStoreInterceptor:使用TokenSessionStoreInterceptor拦截器同样能避免重复提交,TokenSessionStoreInterceptor集成自TokenInterceptor。使用TokenSessionStoreInterceptor将不会输出任何错误信息。如果token无效,请求被导向到invalid.token结果码映射的视图。配置如下:<interceptor-ref name="tokenSession"> <param name="excludeMethods">default</param> </interceptor-ref> 自定义拦截器实现防止重复提交http://wenku.baidu.com/view/a92e0f2458fb770bf78a5565.html. 首先要在jsp的from标签里加入<s:token/>防重复提交标签,<s:token/> 生成如下的内容:(struts.token.name 标识哪个隐藏域存了 token 值) <input type="hidden" name="struts.token.name" value="struts.token"/> <input type="hidden" name="struts.token" value="7GXL55LPSGU19SDC9D3VP54I20XT3BVA"/> 注意自定义的表单域别重名了。它的作用是防止表单重复提交,每次加载页面 struts.token 的值都不一样,如果两次提交时该值一样,则认为是重复提交。此时要启用 TokenInterceptor(token) 拦截器,最好是也启用 TokenSessionStoreInterceptor(token-session) 拦截器,不然后台会出现错误提示:...http://lovemybook.javaeye.com/blog/313566 我以前也用过extjs 一般是在js中定义变量,如果提交这修改变量值this.submitTimes++;if(this.submitTimes>1){ Ext.Msg.show({ title : '����', msg : '���ύ�Ĵ���̫�࣬�����ĵȴ�', buttons : Ext.Msg.OK, animEl : 'elId', icon : Ext.MessageBox.QUESTION }); this.submitTimes=0; return;} 谢谢,只是我这个页面用的extjs,因此你说的这样不好弄! 谢谢,这个方法也挺好!我目前想着用struts2的可能性大些,还有一种方法就是在页面上禁用按钮! {xtype:'textfield', fieldLabel: 'Type', name: 'struts.token.name', hidden:true, hideLabel:true,value:"struts.token"}可以试试看? 用JAVASCRIPT调用DWR好像可以实现 中文乱码 java 图片压缩到 100k 站内搜索技术讨论 页面跳转小问题? ssh流程问题 请问这个代码是连接什么数据库的?? servlet传值jsp收不到的问题 jsp和flash数据怎么交互?分全给了!!!决不吝啬!! 网页中的APPLET不显示,系统高手来啊!!!!!!!!!!!! 745了一晚上!都没有弄好啊tomcat and jsp问题啊 js怎样实现div的显示和隐藏 java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] 找不到文件 '(未知的)'。
<s:token></s:token>
二、struts.xml
配置需要使用的拦截器
配置重复提交时跳转到的页面
<action name="demo05" class="action.Demo05Action">
<interceptor-ref name="token" />
<interceptor-ref name="defaultStack" />
<result>/jsp/ok.jsp</result>
<result name="invalid.token">/jsp/error.jsp</result>
</action>
在页面上的 formpanel 或者 gridpanel 加入一个隐藏域
或者用另外的方法: 提交的时候就把按钮变为灰色,form.isDirty() 判断是否更改了form中的数据
在页面上的 formpanel 或者 gridpanel 加入一个隐藏域
或者用另外的方法: 提交的时候就把按钮变为灰色,form.isDirty() 判断是否更改了form中的数据
首先要在jsp的from标签里加入防重复提交标签,
生成如下的内容:
(struts.token.name 标识哪个隐藏域存了 token 值) 注意自定义的表单域别重名了。
它的作用是防止表单重复提交,每次加载页面 struts.token 的值都不一样,
如果两次提交时该值一样,则认为是重复提交。此时要启用 TokenInterceptor(token) 拦截器,
最好是也启用 TokenSessionStoreInterceptor(token-session) 拦截器,
不然后台会出现错误提示:
com.opensymphony.xwork2.interceptor.ParametersInterceptor setParameters 严重: ParametersInterceptor - [setParameters]: Unexpected Exception catched: Error setting
首先需要在表单中使用<s:token name="user.token"></s:token>
<s:token>标签创建一个新的令牌值,并用你所指定的令牌名把令牌保存到session中。而这个令牌值是随即产生的经过加密的字符序列,不会重复。
其次需要为action配置TokenInterceptor或者TokenSessionStoreInterceptor拦截器。这两个拦截器都已经在struts-default.xml中定义,但没有包含在defaultStack拦截器栈中。
在action中配置拦截器和在重复提交时,将要请求导向的结果视图。
<action name="register" class="com.zhaosoft.action.RegisterAction">
<!-- 配置异常映射,当RegisterAction抛出Exception异常时,向用户显示error.jsp页面 -->
<exception-mapping result="error" exception="java.lang.Exception"/>
<result name="invalid.token">/WEB-INF/pages/register.jsp</result>
<result name="input">/WEB-INF/pages/register.jsp</result>
<result name="success">/WEB-INF/pages/success.jsp</result>
<result name="error">/WEB-INF/pages/error.jsp</result>
<interceptor-ref name="defaultStack">
<param name="workflow.excludeMethods">default</param>
</interceptor-ref>
<interceptor-ref name="token">
<param name="excludeMethods">default</param>
</interceptor-ref>
</action>
注:excludeMethods指定要排除的方法。
在register.jsp页面中添加action级别的错误信息显示的标签:<s:actionerror/>
在form中添加<s:token>标签:<s:token name="user.token"></s:token>
最好为在资源文件中设置键struts.messages.invalid.token的本地化消息。
struts.messages.invalid.token=您已经提交了表单,请不要重复提交。
TokenSessionStoreInterceptor:使用TokenSessionStoreInterceptor拦截器同样能避免重复提交,TokenSessionStoreInterceptor集成自TokenInterceptor。使用TokenSessionStoreInterceptor将不会输出任何错误信息。如果token无效,请求被导向到invalid.token结果码映射的视图。
配置如下:
<interceptor-ref name="tokenSession">
<param name="excludeMethods">default</param>
</interceptor-ref>
.
<input type="hidden" name="struts.token.name" value="struts.token"/>
<input type="hidden" name="struts.token" value="7GXL55LPSGU19SDC9D3VP54I20XT3BVA"/>
注意自定义的表单域别重名了。它的作用是防止表单重复提交,每次加载页面 struts.token 的值都不一样,如果两次提交时该值一样,则认为是重复提交。此时要启用 TokenInterceptor(token) 拦截器,最好是也启用 TokenSessionStoreInterceptor(token-session) 拦截器,不然后台会出现错误提示:...http://lovemybook.javaeye.com/blog/313566
this.submitTimes++;
if(this.submitTimes>1){
Ext.Msg.show({
title : '����', msg : '���ύ�Ĵ���̫�࣬�����ĵȴ�',
buttons : Ext.Msg.OK,
animEl : 'elId',
icon : Ext.MessageBox.QUESTION
});
this.submitTimes=0;
return;
}
{xtype:'textfield', fieldLabel: 'Type', name: 'struts.token.name', hidden:true, hideLabel:true,value:"struts.token"}可以试试看?