(二十三)指令牌验证

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


猜你喜欢

转载自blog.csdn.net/qq1019648709/article/details/80608866