`
top-86
  • 浏览: 4080 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

struts2的<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) 拦截器,不然后台会出现错误提示:

 

2008-5-17 22:39:21 com.opensymphony.xwork2.interceptor.ParametersInterceptor setParameters
严重: ParametersInterceptor - [setParameters]: Unexpected Exception catched: Error setting expression 'struts.token' with value '[Ljava.lang.String;@1c2e163'
2008-5-17 22:39:21 com.opensymphony.xwork2.interceptor.ParametersInterceptor setParameters
严重: ParametersInterceptor - [setParameters]: Unexpected Exception catched: Error setting expression 'struts.token.name' with value '[Ljava.lang.String;@abaf8c'

但不影响使用。不过如果只有 token-session 拦截器却是不行的。

token 和 token-session 拦截器的启用,是在 struts.xml 配置文件中,既可以为包启用,也可以单独为某个 action 启用:
1) 为包启用 token 和 token-session

<package name="mgrSystem" namespace="/web" extends="json-default">
  <interceptors>
   <interceptor-stack name="formDefaultStack">
    <interceptor-ref name="token">
     <param name="includeMethods">save</param>
    </interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
   </interceptor-stack>
  </interceptors>
  <default-interceptor-ref name="formDefaultStack"></default-interceptor-ref>
  <global-results>
   <result name="invalid.token">/web/duplicate.jsp</result>
  </global-results>
  <action name="*Menu" class="menuAction" method="{1}">
   <result>/web/mgrMenuList.jsp</result>
   <result name="input">/web/${url}?id=${menu.id}</result>
  </action>
</package>

2) 为 Action 启用 token 和 token-session

<action name="*Menu" class="menuAction" method="{1}">
   <!--
    <interceptor-ref name="token">
    <param name="includeMethods">save</param>
    </interceptor-ref>
   -->
   <interceptor-ref name="token">
    <param name="includeMethods">save</param>
   </interceptor-ref>
   <interceptor-ref name="defaultStack"></interceptor-ref>
   <result name="invalid.token">/web/duplicate.jsp</result>
   <result>/web/mgrMenuList.jsp</result>
   <result name="input">/web/${url}?id=${menu.id}</result>

</action>

 

注意 token、token-session 和 defaultStack 的顺序要保证,还需要加上名为 "invalid.token" 的 result,当发现重复提交时转向到这个逻辑页,如 /duplicate.jsp,在 /duplicate.jsp 加上 <s:actionerror /> 在出现重复提交时就会提示:The form has already been processed or no token was supplied, please try again.

这样就OK了,但是在页面显示的英文,

The form has already been processed or no token was supplied, please try again.
如何定义成自己想要的呢?这个不难,你找到 struts2-core.jar打开这个文件找到 org.apache.struts2 下里面有一个 struts-message.properties的文件,打开看看里面是否有一个

struts.messages.invalid.token=The form has already been processed or no token was supplied, please try again.


好了,前面的Key就是我们想要的struts.messages.invalid.token 把它复制到你定义的 .properties 文件里,struts.messages.invalid.token = \u5bf9\u4e0d\u8d77\uff0c\u4e0d\u80fd\u91cd\u590d\u63d0\u4ea4

 

 

 

 

 

分享到:
评论

相关推荐

    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=...

    csgate.apk

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

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

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

    重复提交解决实例

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

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

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

    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(标记)

    springboot-springsecurity-jwt-demo

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

    阿里巴巴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" ...

    java程序员必读

    内容包括:自定义类型转换器,文件上传,自定义拦截器,基于XML配置方式实现对action的所有方法进行输入校验,&lt;s:token /&gt;标签防止重复提交等等功能的介绍和详解

    拦截器和控制器的区别

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

    土豆聊天机器人.pdf

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

    让Struts2直接支持浏览FreeMarker的FTL文件

    &lt;servlet-class&gt;org.apache.struts2.views.freemarker.FreemarkerServlet&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;freemarker&lt;/servlet-name&gt; &lt;url-pattern&gt;*.ftl&lt;/url-pattern&gt; &lt;/...

    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...

    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、动态...

    编译器源代码

    其中默认非终极符用&lt;&gt;括上,修改时需要注意.&lt;br/&gt;Grammar.cpp Grammar.h 定义了文法GRAMMAR类,它通过initializtion.h的信息建立文法的内部表示。&lt;br/&gt;LL1_Analyser.cpp LL1_Analyser.h 定义了LL1分析器,即LL1_...

    jsp探针 ver0.1

    Class.forName("org.apache.struts.action.ActionServlet"); supportStruts = true; } catch (ClassNotFoundException ex) { } try { Class.forName("javax.naming.Name"); supportJNDI = true; } catch ...

    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、动态...

    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!为

    Mr-Gee-Bot:Wheatley已集成到我已经糟糕的代码中; 不知道这将如何工作,但确定

    " mongo_database_uri " : " mongodb://&lt;uname&gt;:&lt;pwd&gt;@&lt;host&gt;:&lt;port&gt;/&lt;auth&gt; " , " mysql_database_uri " : " mysql://&lt;uname&gt;:&lt;pwd&gt;@&lt;host&gt;:&lt;port&gt;/&lt;auth&gt; " , " database " : " &lt;db&gt; " , " database_type " : ...

Global site tag (gtag.js) - Google Analytics