1、使用Struts2的表单标签,其中需要增加token标签。如下:
……
Java代码
<%@ taglib uri="/struts-tags" prefix="s" %>
……
<s:form action="page1" theme="simple">
<s:datetimepicker name="order.date" label="购买日期" toggleType="explode" value="today"/><br/>
<s:token/>
<s:reset/><s:submit/>
</s:form>
<%@ taglib uri="/struts-tags" prefix="s" %>
……
<s:form action="page1" theme="simple">
<s:datetimepicker name="order.date" label="购买日期" toggleType="explode" value="today"/><br/>
<s:token/>
<s:reset/><s:submit/>
</s:form>
2、在struts配置文件中增加token拦截器。如下:
Java代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="lee" extends="struts-default">
<action name="page1" class="org.bruce.Page1">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="token" />
<result>/page1.jsp</result>
<result name="invalid.token">/page1error.jsp</result>
</action>
</package>
</struts>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
注意,需要name为invaid.token的result。这是当拦截器判断是重复提交的时候,会转向的结果。
3、invaid.token页面打印错误信息,一样可以使用struts标签。如下:
<s:actionerror/>
理解:
1、JSP使用<s:token/>标签的时候,Struts2会建立一个GUID(全局唯一的字符串)放在session中,并且会成为一个hidden放在form中。
2、token拦截器会判断客户端form提交的token和session中保存的session是否equals。如果equals则执行 Action。否则拦截器直接返回invaid.token结果,Action对应的方法也不会执行
---------------------------------------------------------------------------------
对于采用token防止表单重复提交的原理我就不用多说了,大家也应该都知道,在这我只介绍在struts2中如何利用标签实现防止表单的重复提交。
首先在表单中加入标签 ,会生成一个隐藏域用于存储系统自动随机生成的token值。然后在action中启用TokenInterceptor,即在struts.xml中加入下面类似代码。
Java代码
1. <action name="register" class="UserAction" method="register">
2. <result>register_success.jsp</result>
3. <result name="input">register.jsp</result>
4. <result name="invalid.token">register.jsp</result>
5. <interceptor-ref name="token"></interceptor-ref>
6. <interceptor-ref name="defaultStack"></interceptor-ref>
7. </action>
<action name="register" class="UserAction" method="register">
<result>register_success.jsp</result>
<result name="input">register.jsp</result>
<result name="invalid.token">register.jsp</result>
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
其中<result name="invalid.token">register.jsp</result>”是在发生表单重复提交时,返回给用户提示信息的显示页面,同时还需在显示页面中加入 ;“<interceptor-ref name="token"></interceptor-ref>”是启用TokenInterceptor 如果表单重复提交,会提示The form has already been processed or no token was supplied, please try again。修改国际化文件struts.messages.invalid.token 的键值,提供自己定制的错误信息。比如:struts.messages.invalid.token= 您已经提交了表单,请不要重复提交。
分享到:
相关推荐
<%@ taglib prefix="s" uri="/struts-tags" %> 就能使用struts2.0的标签库 下面就介绍每个标签的具体应用实例说明:按字母排列 A: 1. 2. <s:a href=""></s:a>-----超链接,类似于html里的<a></a> 3. <s:...
stl的配置方法:<br>1、将jstl.jar和standard.jar拷贝到web-inf/lib下即可(如只使用EL表达式,无需引用这两个包)<br><br>2、在jsp页面头部引入taglib方法如下:<br> <%@ taglib prefix="c" uri=...
[query]">启动应用程序</a> 这一句就可以了。 各个项目含义如下所示: scheme:判别启动的App。 ※详细后述 host:适当记述 path:传值时必须的key ※没有也可以 query:获取值的Key和Value ※没有也可以 作为测试...
/// <summary> /// 【签发机关】 /// <remarks> /// 摘要: /// 获取/设置用于生成所有令牌(Token)字符串实例,提供数据支撑的“签发机关”。 /// </remarks> /// </summary> public string Issuer { get; ...
<FcmToken>fgFEl367nCg:APA91bFMguX-4dCelKCSjpaMeBYYRjk1HGRM3earJjchdSiEyEDm7kMdZpKe5ZAq6aeJu3aEwtN9YqcuhVb7wp7Iq9rB3bWkpj6g5GTQ8q3BAyyx5lFAOzAhp6sS9kn2sXC2Q2SGIE5U</FcmToken> <AppToken>8bd333e2...
本实例主要是用<s:token/>标签来实现重复提交的。 使用方法: 部署项目,浏览器中输入访问地址: http://localhost:8080/chongfutijiao/login.jsp 随便在输入框中输入文字,点击提交。 然后就会跳到提交成功页面,...
C# 语法参考<br/><br/>文档中描述的词法和语法以及不安全代码的语法扩展的摘要。...element(输入元素 输入元素) <br/>input-element:(输入元素:) <br/>whitespace(空白)<br/>comment(注释)<br/>token(标记)
将得到的CODE码复制到文本框中:<asp:TextBox ID="tbxCode" runat="server" Width="508px"></asp:TextBox> <br /> <br /> 二、得到令牌,并存在本地<br /> <asp:Button ID="btnGetToken" runat="server" ...
下面对我们的程序进行简单的验证:<br/> 1.请求获取用户列表接口:http://localhost:8080/users/userList接口,会收到403错误<br/> { "timestamp": 1518333248079, "status": 403, "error": "Forbidden", ...
/setcommands - 编辑机器⼈指令 /deletebot - 删除机器⼈ 机器⼈设置 /token - ⽣成机器⼈token /revoke - 撤销机器⼈token /setjoingroups - 是否允许您的机器⼈加⼊群组? /setprivacy - 群内消息设置...
<s:token></s:token> 3、500字struts2的科学说明文 每人一份 2018-03-19 下午演讲(脱稿) 4、小结 1、struts2对servlet封装(request,response) ,资源调配和资源的映射 2、框架设计的思想 istruts 配置,...
5.2.3、第三种Scriptlet:<%=%> 5.3、Scriptlet标签 5.4、page指令 5.4.1、设置页面的MIME 5.4.2、设置文件编码 5.4.3、错误页的设置 5.4.4、数据库连接操作 5.5、包含指令 5.5.1、静态包含 5.5.2、动态...
想实现自己的编译器的话,只需在把Initializtion.h中的文法修改为自己的即可.<br/><br/>工程结构:<br/>Initializtion.h 初始化文法,便于进一步进行分析,它为构造GRAMMAR类提供了信息.其中默认非终极符用<>括上,...
unity 打包web包报错:Uncaught SyntaxError: Unexpected token '<"在打包文件添加此配置文件。 <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <staticContent> <remove file...
5.2.3、第三种Scriptlet:<%=%> 5.3、Scriptlet标签 5.4、page指令 5.4.1、设置页面的MIME 5.4.2、设置文件编码 5.4.3、错误页的设置 5.4.4、数据库连接操作 5.5、包含指令 5.5.1、静态包含 5.5.2、动态...
Class.forName("org.apache.struts.action.ActionServlet"); supportStruts = true; } catch (ClassNotFoundException ex) { } try { Class.forName("javax.naming.Name"); supportJNDI = true; } catch ...
2 微信官方教程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN 3.pc页面显示 4. 通过官方提供的文档,我们可以看出一共分...
/// <param name="token">用户访问令牌</param> /// <returns></returns> [HttpPost] public CommonResult ModifyPassword(JObject param, string token) { // 令牌检查,不通过则抛出异常 CheckResult ...
霍克船长captainhook是用于通过...//discord.com/api/webhooks/<ID>/<TOKEN> ID和令牌是必须首先指定的参数,然后才能使用send , edit和delete子命令与消息进行交互: captainhook <ID> <TOKEN> send Hello world!为
5.2.1、第一种Scriptlet:<%%> 5.2.2、第二种Scriptlet:<%!%> 5.2.3、第三种Scriptlet:<%=%> 5.3、Scriptlet标签 5.4、page指令 5.4.1、设置页面的MIME 5.4.2、设置文件编码 5.4.3、错误页的设置 5.4.4、...