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

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释下这段代码:private static void createPicture(int format, InputStream pictureData, int width, int height, XWPFParagraph paragraph) { String blipId = null; try { blipId = paragraph.getDocument().addPictureData(pictureData, format); } catch (InvalidFormatException e) { e.printStackTrace(); } int id = paragraph.getDocument().getAllPictures().size() - 1; final int EMU = 9525; width *= EMU; height *= EMU; CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline(); String picXml = "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">" + " <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" + " <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" + " <pic:nvPicPr>" + " <pic:cNvPr id=\"" + id + "\" name=\"Generated\"/>" + " <pic:cNvPicPr/>" + " </pic:nvPicPr>" + " <pic:blipFill>" + " <a:blip r:embed=\"" + blipId + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>" + " <a:stretch>" + " <a:fillRect/>" + " </a:stretch>" + " </pic:blipFill>" + " <pic:spPr>" + " <a:xfrm>" + " <a:off x=\"0\" y=\"0\"/>" + " <a:ext cx=\"" + width + "\" cy=\"" + height + "\"/>" + " </a:xfrm>" + " <a:prstGeom prst=\"rect\">" + " <a:avLst/>" + " </a:prstGeom>" + " </pic:spPr>" + " </pic:pic>" + " </a:graphicData>" + "</a:graphic>"; inline.addNewGraphic().addNewGraphicData(); XmlToken xmlToken = null; try { xmlToken = XmlToken.Factory.parse(picXml); } catch (XmlException xe) { xe.printStackTrace(); } inline.set(xmlToken); inline.setDistT(0); inline.setDistB(0); inline.setDistL(0); inline.setDistR(0); CTPositiveSize2D extent = inline.addNewExtent(); extent.setCx(width); extent.setCy(height); CTNonVisualDrawingProps docPr = inline.addNewDocPr(); docPr.setId(id); docPr.setName("img" + id); docPr.setDescr("word" + id); }
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值