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

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









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值