事实证明,事业越成功的人,也就越有宽容之心。宽容犹如春天,可使万物生长,成就一片阳春景象。有多大度来成多大事。
先谈两个概念:
1.什么是表单重复提交?
①由于用户网速慢问题,用户会不断点击提交按钮,或者刷新提交界面,形成表单重复提交。
②已经提交的界面,用户选择后退恶意刷新界面形成重复提交。
2.令牌机制
在Struts2中使用令牌机制解决表单重复提交问题,产生一个随机字符串,在服务端和客户端同时保留这个字符串副本,在客户端向服务端发送请求的过程中,会自动发送此副本。服务端接收到请求后,判断本地的令牌适合提交上来的令牌是否相符。如果相符,就执行提交动作完成数据库相应的逻辑业务,完成之后服务端会立刻产生一个新的令牌,而客户端的字符串还是原来的字符串,那么,此时如果客户端在提交,服务端与客户端的令牌已经不一致了,就会判定为重复提交。
操作防止表单重复提交的步骤:
1.在jsp页面中,加入token指令:
<%@ page language="java" pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html >
<html>
<head>
<meta charset="UTF-8">
<title>登录界面</title>
</head>
<body>
<form action="index.action" method="post">
<s:token/>
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
2.在struts.xml中配置token拦截器:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="root" namespace="/" extends="struts-default">
<interceptors>
<interceptor-stack name="myInterceptor">
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myInterceptor"/>
<action name="index" class="com.action.IndexAction">
<result>/welcome.jsp</result>
<result name="invalid.token">/error.jsp</result>
</action>
</package>
</struts>