<s:token/>标签防止重复提交
用法如下
第一步:
在表单中加入<s:token/>
<s:form act
姓名:<s:textfield name="name"></s:textfield>
<s:token></s:token>
<s:submit value="提交"/>
</s:form>
第二步:
<?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="token" namespace="/test" extends="struts-default">
<act
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="token"></interceptor-ref>
<result name="invalid.token">/index.jsp</result>
<result>/message.jsp</result>
</act
</package>
</struts>
以上配置加入了token拦截器和invalid.token结果,因为token拦截器会在回话的token与请求的token不一致时,将会直接返回invalid.token结果
在debug状态,控制台会出现以下信息,是因为act
事例:
1.在index.jsp中定义表单
<s:form act
姓名:<s:textfield name="name"></s:textfield>
<s:token></s:token>
<s:submit value="提交"/>
</s:form>
2.配置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="token" namespace="/test" extends="struts-default">
<act
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="token"></interceptor-ref>
<result name="invalid.token">/index.jsp</result>
<result>/message.jsp</result>
</act
</package>
</struts>
3.在message.jsp中显示输入的名字
<%@ taglib uri="/struts-tags" prefix="s" %>
<s:property value="name"/>
4.在类中完成方法属性等
package com.qn.act
imp
public class PersonAction extends ActionSupport{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String execute() throws Exception {
return "success";
}
}
结果
点击刷新后
为什么加入token后会防止重复提交呢?
首先不仅仅要在表单中加入token还要在struts.xml配置文件中加入拦截器。
<interceptor-ref name="token"></interceptor-ref>
同时还要加入系统默认的
<interceptor-ref name="defaultStack"></interceptor-ref>
当token拦截到用户的请求后,会判断在表单中生成的token的id也就是数字和英文组成
和保存在session(服务器端)的id是否相等如果相等就是地址提交。那么这个拦截器会将存放在session服务器端的session id值做一下变更
做变更后用户在点击刷新按钮,重复提交。拦截器会检查出来session id和用户提交的token id是不一样的,这个时候拦截器就会将这个请求发送到名字为invalid.token的视图,在这个试图上配置上页面就可以了。