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的实现更加的容易.