JAVA-Struts2防止表单重复提交

来源:互联网 发布:ubuntu 安装sqlserver 编辑:程序博客网 时间:2024/05/29 16:09

好记性不如赖笔头……

表单重复提交的问题可能大多数开发者都会遇到,在未使用Struts2框架之前的解决方案是在进入提交表单页面,将验证码保存在session中,当表单提交时,就会验证 验证码是否存在,如果存在,则删除,通过 验证,如果不存在,则提示重复提交或超时。

Struts2中提供了防止表单提效的拦截器token/tokenSession,他们的作用分别是:

1. token拦截器:如果重复提交会直接返回“No result defined for action com.ckinghan.web.action.RegAction and result invalid.token”提示,须要自己定义”invalid.token”的返回视图。

2. tokenSession拦截器:对于重复提交的表单请求忽略,不做任何处理。

注意,它们使用的前提是,在JSP页面,须要使用s:token标签。

示例如下:

1、创建reSubmit.jsp页面,具体代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>重复提交表单测试</title>  </head>  <body>    <hr>    <h1>用户注册</h1>    <s:form action="reg">        <s:token></s:token>        <s:textfield name="userName" label="昵称"/>        <s:password name="password" label="密码"/>        <s:submit value="注册"></s:submit>    </s:form>  </body></html>

2、创建RegAction动作类,并继承ActionSupport,具体代码如下:

package com.ckinghan.web.action;import com.opensymphony.xwork2.ActionSupport;public class RegAction extends ActionSupport {    private String userName;    private String password;    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public String reg(){        System.out.println(userName);        System.out.println(password);        return SUCCESS;    }}

3、创建Struts.xml文件,存储在src目录下,具体配置如下:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <constant name="struts.devMode" value="true"/>    <package name="formReSumbit" extends="struts-default">            <action name="reg" class="com.ckinghan.web.action.RegAction" method="reg">            <!--  先执行默认拦截器(如果在这里配置了非默认拦截器,默认拦截器将不在执行,所以在这里将默认拦截器也配置上)  -->            <interceptor-ref name="defaultStack"/>            <!--  tokenSession拦截器,对于重复提交的表单不做任何处理  -->            <interceptor-ref name="tokenSession"/>            <!--  token拦截器与tokenSession拦截器使用一个就可以了,使用了token拦截器,必须配合“invalid.token”的返回视图  --><!--            <interceptor-ref name="session"/> -->            <result>/success.jsp</result>            <!-- 配合token拦截器使用 --><!--            <result name="invalid.token">/error.jsp</result> -->        </action>    </package></struts>

4、error.jsp文件的内容如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>错误提示</title>  </head>  <body>    请勿重复提交  </body></html>

配置完成,启动项目,访问结果如下:

这里写图片描述

提交后,页面提示的内容如下:

这里写图片描述

后台输出内容如下:

这里写图片描述

刷新重复提交 后,显示页面包括后台输出无任何变化,说明防止重复提交成功。

原创粉丝点击