struts2---防重复提交解析
来源:互联网 发布:js单选框默认选中 编辑:程序博客网 时间:2024/06/03 12:46
struts2 中防表单刷新,再strut2中防表单刷新主要有三步:
1.在submit标签前加上<s:token />标签
此标签会在jsp页面上生成如下两个标签:
<input type="hidden" name="struts.token.name" value="token" />
<input type="hidden" name="token" value="NLCQVRVSY0FUB6HXMQ31ISUK9BEA1ST6" />
这两个标签中,第一个标签将会以"struts.token.name为属性名,存入到session域中,其值为
首次提交时第二个标签的随机值。第二个标签在每次提交时都会变化。这样在重复提交时,struts2
底层实现是利用第二个标签的值与session中的struts.token.name来进行比较,要是不一致则认为是
重复提交操作,将会返回一个invalid.token视图名。
2.在struts.xml配置文件中,配置token拦截器
<interceptor-ref name="token" />
<interceptor-ref name="defaultStack"/>
第一个拦截器为token拦截器,它将主要负责验证步骤一种token值是否有效(相等为有效,不相等
为无效). 第二个拦截器为默认拦截器,当不配置时,struts2会默认选择此拦截器。
主要源码如下:
要是不一致,即token验证无效(即重复提交),将由下述代码处理无效的token
1.在submit标签前加上<s:token />标签
此标签会在jsp页面上生成如下两个标签:
<input type="hidden" name="struts.token.name" value="token" />
<input type="hidden" name="token" value="NLCQVRVSY0FUB6HXMQ31ISUK9BEA1ST6" />
这两个标签中,第一个标签将会以"struts.token.name为属性名,存入到session域中,其值为
首次提交时第二个标签的随机值。第二个标签在每次提交时都会变化。这样在重复提交时,struts2
底层实现是利用第二个标签的值与session中的struts.token.name来进行比较,要是不一致则认为是
重复提交操作,将会返回一个invalid.token视图名。
2.在struts.xml配置文件中,配置token拦截器
<interceptor-ref name="token" />
<interceptor-ref name="defaultStack"/>
第一个拦截器为token拦截器,它将主要负责验证步骤一种token值是否有效(相等为有效,不相等
为无效). 第二个拦截器为默认拦截器,当不配置时,struts2会默认选择此拦截器。
主要源码如下:
public static boolean validToken() {String tokenName = getTokenName(); //获取步骤一中名为token的hidden标签...String token = getToken(tokenName);//获取其生成的随机值...//从session中获取名为struts.token.name的属性值Map session = ActionContext.getContext().getSession();String tokenSessionName = buildTokenSessionAttributeName(tokenName);String sessionToken = (String) session.get(tokenSessionName);//比较两个值是否相等if (!token.equals(sessionToken)) {if (LOG.isWarnEnabled()) {LOG.warn(LocalizedTextUtil.findText(TokenHelper.class, "struts.internal.invalid.token", ActionContext.getContext().getLocale(), "Form token {0} does not match the session token {1}.", new Object[]{token, sessionToken}));}return false;}// remove the token so it won't be used againsession.remove(tokenSessionName);return true;}
要是不一致,即token验证无效(即重复提交),将由下述代码处理无效的token
protected String handleInvalidToken(ActionInvocation invocation) throws Exception {Object action = invocation.getAction(); //获取处理的actionString errorMessage = getErrorMessage(invocation); //获取错误提示信息,可以通过//配置国际化资源,从其中获取(资源属性名为struts.messages.invalid.token)if (action instanceof ValidationAware) {((ValidationAware) action).addActionError(errorMessage);} else {log.warn(errorMessage);}//返回一个视图名为invalid.token的字符串return INVALID_TOKEN_CODE;}protected String getErrorMessage(ActionInvocation invocation) {Object action = invocation.getAction();if (action instanceof TextProvider) {return ((TextProvider) action).getText(INVALID_TOKEN_MESSAGE_KEY, DEFAULT_ERROR_MESSAGE);}return textProvider.getText(INVALID_TOKEN_MESSAGE_KEY, DEFAULT_ERROR_MESSAGE);}
3. 在处理提交的action中编写一个名为invalid.token的result视图
示例:
jsp
<s:form action="addUser"> <s:textfield name="name" label="用户名"/><br /> <s:textfield name="age" label="年龄"/><br /> <s:token /> <s:submit value="添加"/> </s:form>
struts2.xml配置文件
<action name="addUser" class="cn.itcast.action.AddUserAction"> <interceptor-ref name="token" /> <interceptor-ref name="defaultStack"/> <result type="chain">listUser</result> <result name="invalid.token">/jsp/norefresh.jsp</result></action><action name="listUser" class="cn.itcast.action.ListUserAction"> <result>/jsp/listUser.jsp</result> </action>
0 0
- struts2---防重复提交解析
- struts2防重复提交
- struts2防重复提交
- struts2防页面刷新重复提交
- Struts2防刷新重复提交表单设置
- struts2学习笔记(十四)防重复提交
- 防刷新重复提交
- JS防重复提交
- Webwork防重复提交
- 网页防重复提交
- 防重复提交
- 防重复提交
- 防表单重复提交
- 防表单重复提交
- 防重复提交
- 防表单重复提交
- 防刷新重复提交
- 防重复提交
- Nginx启动初始化(1)
- ubuntu下android开发工具的安装
- 轻松搞定javascript预解析机构(搞定后,一切有关变态面试题都是浮云)
- CC_SYNTHESIZE
- Nginx启动(ngx_init_cycle)
- struts2---防重复提交解析
- 强大Linux网站
- Ubuntu 或 UbuntuKyKin14.04 Unity桌面风格与Gnome桌面风格的切换
- Dalvik和JVM的区别?
- IPAD SSH 不成功!fix it
- 读《深入浅出MySQL:数据库开发、优化与管理维护》,学习了第一章
- VM(虚拟机技术)保护
- Nginx配置项解析
- 容器补充