`

struts2的<s:token/>使用

阅读更多
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= 您已经提交了表单,请不要重复提交。
分享到:
评论

相关推荐

    struts2 标签库 帮助文档

    &lt;%@ taglib prefix="s" uri="/struts-tags" %&gt; 就能使用struts2.0的标签库 下面就介绍每个标签的具体应用实例说明:按字母排列 A: 1. 2. &lt;s:a href=""&gt;&lt;/s:a&gt;-----超链接,类似于html里的&lt;a&gt;&lt;/a&gt; 3. &lt;s:...

    struts_jstl

    stl的配置方法:&lt;br&gt;1、将jstl.jar和standard.jar拷贝到web-inf/lib下即可(如只使用EL表达式,无需引用这两个包)&lt;br&gt;&lt;br&gt;2、在jsp页面头部引入taglib方法如下:&lt;br&gt; &lt;%@ taglib prefix="c" uri=...

    点击浏览器中的URL链接,启动特定的App。

    [query]"&gt;启动应用程序&lt;/a&gt; 这一句就可以了。 各个项目含义如下所示: scheme:判别启动的App。 ※详细后述 host:适当记述 path:传值时必须的key ※没有也可以 query:获取值的Key和Value ※没有也可以 作为测试...

    230206-029shopDemo(JwtBearer身份认证配置的定义实现)

    /// &lt;summary&gt; /// 【签发机关】 /// &lt;remarks&gt; /// 摘要: /// 获取/设置用于生成所有令牌(Token)字符串实例,提供数据支撑的“签发机关”。 /// &lt;/remarks&gt; /// &lt;/summary&gt; public string Issuer { get; ...

    csgate.apk

    &lt;FcmToken&gt;fgFEl367nCg:APA91bFMguX-4dCelKCSjpaMeBYYRjk1HGRM3earJjchdSiEyEDm7kMdZpKe5ZAq6aeJu3aEwtN9YqcuhVb7wp7Iq9rB3bWkpj6g5GTQ8q3BAyyx5lFAOzAhp6sS9kn2sXC2Q2SGIE5U&lt;/FcmToken&gt; &lt;AppToken&gt;8bd333e2...

    重复提交解决实例

    本实例主要是用&lt;s:token/&gt;标签来实现重复提交的。 使用方法: 部署项目,浏览器中输入访问地址: http://localhost:8080/chongfutijiao/login.jsp 随便在输入框中输入文字,点击提交。 然后就会跳到提交成功页面,...

    C# 语法参考

    C# 语法参考&lt;br/&gt;&lt;br/&gt;文档中描述的词法和语法以及不安全代码的语法扩展的摘要。...element(输入元素 输入元素) &lt;br/&gt;input-element:(输入元素:) &lt;br/&gt;whitespace(空白)&lt;br/&gt;comment(注释)&lt;br/&gt;token(标记)

    阿里巴巴API开发sdk .net平台

    将得到的CODE码复制到文本框中:&lt;asp:TextBox ID="tbxCode" runat="server" Width="508px"&gt;&lt;/asp:TextBox&gt; &lt;br /&gt; &lt;br /&gt; 二、得到令牌,并存在本地&lt;br /&gt; &lt;asp:Button ID="btnGetToken" runat="server" ...

    springboot-springsecurity-jwt-demo

    下面对我们的程序进行简单的验证:&lt;br/&gt; 1.请求获取用户列表接口:http://localhost:8080/users/userList接口,会收到403错误&lt;br/&gt; { "timestamp": 1518333248079, "status": 403, "error": "Forbidden", ...

    土豆聊天机器人.pdf

    /setcommands - 编辑机器⼈指令 /deletebot - 删除机器⼈ 机器⼈设置 /token - ⽣成机器⼈token /revoke - 撤销机器⼈token /setjoingroups - 是否允许您的机器⼈加⼊群组? /setprivacy - 群内消息设置...

    拦截器和控制器的区别

    &lt;s:token&gt;&lt;/s:token&gt; 3、500字struts2的科学说明文 每人一份 2018-03-19 下午演讲(脱稿) 4、小结 1、struts2对servlet封装(request,response) ,资源调配和资源的映射 2、框架设计的思想 istruts 配置,...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    5.2.3、第三种Scriptlet:&lt;%=%&gt; 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中的文法修改为自己的即可.&lt;br/&gt;&lt;br/&gt;工程结构:&lt;br/&gt;Initializtion.h 初始化文法,便于进一步进行分析,它为构造GRAMMAR类提供了信息.其中默认非终极符用&lt;&gt;括上,...

    unity web报错:Uncaught SyntaxError: Unexpected token '<"

    unity 打包web包报错:Uncaught SyntaxError: Unexpected token '&lt;"在打包文件添加此配置文件。 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;configuration&gt; &lt;system.webServer&gt; &lt;staticContent&gt; &lt;remove file...

    java web 视频、电子书、源码(李兴华老师出版)

    5.2.3、第三种Scriptlet:&lt;%=%&gt; 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、动态...

    jsp探针 ver0.1

    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. 通过官方提供的文档,我们可以看出一共分...

    Web-API接口设计经验总结.docx

    /// &lt;param name="token"&gt;用户访问令牌&lt;/param&gt; /// &lt;returns&gt;&lt;/returns&gt; [HttpPost] public CommonResult ModifyPassword(JObject param, string token) { // 令牌检查,不通过则抛出异常 CheckResult ...

    captainhook:Discord Webhooks的CLI前端

    霍克船长captainhook是用于通过...//discord.com/api/webhooks/&lt;ID&gt;/&lt;TOKEN&gt; ID和令牌是必须首先指定的参数,然后才能使用send , edit和delete子命令与消息进行交互: captainhook &lt;ID&gt; &lt;TOKEN&gt; send Hello world!为

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    5.2.1、第一种Scriptlet:&lt;%%&gt; 5.2.2、第二种Scriptlet:&lt;%!%&gt; 5.2.3、第三种Scriptlet:&lt;%=%&gt; 5.3、Scriptlet标签 5.4、page指令 5.4.1、设置页面的MIME 5.4.2、设置文件编码 5.4.3、错误页的设置 5.4.4、...

Global site tag (gtag.js) - Google Analytics