Token的实现原理以及Struts2.x中对Token的支持.
具体内容
在现实的开发之中会出现这样一种情况,当用户填写了一个表单,而后将此表单提交之后,用户直接选择后退操作回到了原本的表单上.那么为了解决这样的问题,最早的时候是使用session进行处理
但是到了Struts2.x的时候实际上针对于Token的验证操作就变得更加容易了,因为有拦截器的应用,以及除了拦截器还有标签的支持.任何的Struts2.x开发都必须满足一个条件,由Action找到JSP.
范例:定义一个PrepareAction,目的是让其简单的跳转到JSP页
package cn.zwn.action; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class PrepareAction extends ActionSupport{ public String insertPre(){ return "input.page"; } }
范例:定义一个MessageAction,目的是进行输出.
package cn.zwn.action; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class MessageAction extends ActionSupport{ private String msg; public void setMsg(String msg) { this.msg = msg; } public String inset(){ System.out.println(this.msg); return "input.page"; } }
范例:定义struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="root" namespace="/"> <action name="MessageAction" class="cn.zwn.action.MessageAction"/> <action name="PrepareAction" class="cn.zwn.action.PrepareAction"> <result name="input.page">input.jsp</result> </action> </package> </struts>
而后关键是在JSP页面上,这个页面中要进行一个标签的使用
范例:定义input.jsp页面
<body> <form action="MessageAction!insert.action" method="post"> 请输入信息:<input type="text" name="msg"> <s:token name="repeat"></s:token> <input type="submit" value="提交"> </form> </body>
随后执行页面的时候查看生成的源代码.
<form action="MessageAction!insert.action" method="post" data-genuitec-lp-enabled="false" data-genuitec-file-id="wc3-0" data-genuitec-path="/TokenProject/WebRoot/input.jsp"> 请输入信息:<input type="text" name="msg"> <input type="hidden" name="struts.token.name" value="repeat" /> <input type="hidden" name="repeat" value="FV882MZ452UIONMH8CRAI5A38KS1SSZJ" /> <input type="submit" value="提交"> </form>
如果想要进行错误信息的输出,可以使用如下的标签完成;
<s:actionerror/>
但是此时这个标签上所显示的信息都是英文信息.如果想要定义信息则必须要定义struts.properties文件
范例:定义Message.properties文件
struts.messages.invalid.token=\u60A8\u7684\u8868\u5355\u5DF2\u7ECF\u63D0\u4EA4\u8FC7\u4E86,\u8BF7\u52FF\u91CD\u590D\u63D0\u4EA4
你在项目中几乎所有用到的key的信息都会在开发包中提供相应的名称.
总结:利用Token可以有效的解决表单重复提交操作,在实际的开发之中,此类操作会经常性的出现,相比较自己的实现,Struts2.x的实现更加的容易.