您的位置:首页 > 其它

Token(解决重复提交的问题)

2014-07-07 13:30 330 查看
Token主要是以一种指令牌的形式进行重复提交处理的,在很多情况下,如果用户对同一个表单进行了多次提交,则有可能造成数据的混乱,此时,Web服务器必须可以对这种重复提交的行为作出处理。

设置Token就是向session中保存一个属性,而判断Token就是从session中取出属性对内容进行验证,如果验证成功,则正常操作,如果验证失败,则进行错误处理。

Token操作的相关方法

NO.方法类型描述
1protected boolean isTokenValid(HttpServletRequest request)普通判断Token是否存在,如果存在则返回true,如果不存在则返回false
2protected void saveToken(HttpServletRequest request)普通设置Token
3protected void resetToken(HttpServletRequest request)普通删除Token
例:使用Token完成一个用户输入数据的操作

编写首页,给出连接,并获得Token----index.jsp

<%@ page language="java" pageEncoding="GBK"%>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
<html:html lang="true">
<head>
<html:base />
<title>hello.jsp</title>
</head>
<body>
<h3><a href="tokenforward.do">获取Token,输入数据</a></h3>
</body>
</html:html>
编写ActionForm----TokenforwardForm.java

package org.lxh.struts.form;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class TokenforwardForm extends ActionForm {

public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
return null;
}

public void reset(ActionMapping mapping, HttpServletRequest request) {

}
}
编写Action----TokenforwardAction.java

package org.lxh.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.lxh.struts.form.TokenforwardForm;

public class TokenforwardAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
super.saveToken(request) ;	// 表示的是设置了一个token
return mapping.findForward("input");
}
}
编写输入数据页面------input.jsp

<%@ page language="java" pageEncoding="GBK"%>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
<html:html lang="true">
<head>
<html:base />
<title>hello.jsp</title>
</head>
<body>
<html:errors/>
<html:form action="input.do" method="post">
请输入信息:<html:text property="info"></html:text>
<html:submit value="显示"></html:submit>
</html:form>
</body>
</html:html>
编写输入数据的ActionForm----InputForm.java

package org.lxh.struts.form;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class InputForm extends ActionForm {

private String info;

public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
return null;
}

public void reset(ActionMapping mapping, HttpServletRequest request) {
}

public String getInfo() {
return info;
}

public void setInfo(String info) {
this.info = info;
}
}
定义接收输入数据的Action----InputAction.java

package org.lxh.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.lxh.struts.form.InputForm;

public class InputAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
InputForm inputForm = (InputForm) form;
if (super.isTokenValid(request)) { // 如果设置的Token正确,则进行操作
System.out.println("输入内容:" + inputForm.getInfo());
super.resetToken(request);// 取消设置的Token
} else { // Token不正确
ActionMessages errors = new ActionMessages();
errors.add("token", new ActionMessage("error.token"));
super.saveErrors(request, errors);
return mapping.getInputForward();
}
return null;
}
}
修改struts-config.xml配置文件

<struts-config>
<form-beans>
<form-bean name="tokenforwardForm"
type="org.lxh.struts.form.TokenforwardForm" />
<form-bean name="inputForm" type="org.lxh.struts.form.InputForm" />

</form-beans>

<global-exceptions />
<global-forwards />
<action-mappings>
<action attribute="tokenforwardForm"
input="/form/tokenforward.jsp" name="tokenforwardForm"
path="/tokenforward" scope="request"
type="org.lxh.struts.action.TokenforwardAction">
<forward name="input" path="/input.jsp"></forward>
</action>
<action
attribute="inputForm"
input="/input.jsp"
name="inputForm"
path="/input"
scope="request"
type="org.lxh.struts.action.InputAction" />

</action-mappings>

<message-resources parameter="org.lxh.struts.ApplicationResources" />
</struts-config>
编写资源文件,添加错误信息----ApplicationResources.properties

#请不要重复提交
error.token = \u8bf7\u4e0d\u8981\u91cd\u590d\u63d0\u4ea4\uff01
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: