java Struts2防止表单重复提交代码
先要配置拦截器,拦截器用于控制重复提交内容!其实原理很简单,就是在表单内生成一个序列,判断是否为新的序列,如果是之前的序列,则证明是一个重复提交内容!
代码如下 |
复制代码 |
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="common" extends="struts-default" namespace="/common">
<interceptors>
<interceptor-stack name="loginStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="token"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="loginStack"></default-interceptor-ref>
<action name="loginAction_*" class="loginAction" method="{1}">
<result name="success">/welcome.jsp</result>
<result name="invalid.token" type="redirect">/index.jsp</result>
<result name="input" type="redirect">/index.jsp</result>
</action>
</package>
</struts>
|
注意:
如果你不引用:
代码如下 |
复制代码 |
<interceptor-ref name="defaultStack"></interceptor-ref>那么你的后台就不能再接收到参数。
<result name="invalid.token" type="redirect">/index.jsp</result>
<result name="input" type="redirect">/index.jsp</result>
|
这两个返回你一定要配置!一个是重复提交的处理,一个是没有表单标记时的处理!
JSP中增加Struts标签的引用
代码如下 |
复制代码 |
<%@taglib prefix="s" uri="/struts-tags" %>在表单内增加一个标记:
<s:form action="" name="form1" method="post">
<s:token></s:token>
</s:form>
|
页面上会看到输出两个隐藏域:
代码如下 |
复制代码 |
<input type="hidden" name="struts.token.name" value="struts.token"/>
<input type="hidden" name="struts.token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/>
|
上面说了很多可能还有朋友不理解,下面我来举个实例
struts.xml配置文件
代码如下 |
复制代码 |
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 默认的视图主题 -->
<constant name="struts.ui.theme" value="simple" />
<!-- struts2在防止表单重复提交的拦截中有2个,分别是:token,tokenSession。tokenSession继承token而来。
通常情况下,使用tokenSession客户端感觉会比较友好。 -->
<!-- 如果重复提交,会跳转到error.jsp页面 -->
<package name="person" namespace="/test" extends="struts-default">
<action name="token" class="com.ljq.action.PersonAction">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="token" />
<!-- 如果重复提交,跳转到error.jsp页面 -->
<result name="invalid.token">/WEB-INF/page/error.jsp</result>
<result>/WEB-INF/page/message.jsp</result>
</action>
<action name="tokenSession" class="com.ljq.action.PersonAction">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="tokenSession" />
<!-- 如果重复提交,不会跳转到error.jsp页面 -->
<result name="invalid.token">/WEB-INF/page/error.jsp</result>
<result>/WEB-INF/page/message.jsp</result>
</action>
</package>
</struts>
|
PersonAction类
代码如下 |
复制代码 |
package com.ljq.action;
import java.util.ArrayList;
import java.util.List;
public class PersonAction {
private String name;
@SuppressWarnings("unchecked")
//观看控制台
//如果token生效则不会在控制台输出name的值,而会输出如下警告: 2011-3-14 20:45:32 com.opensymphony.xwork2.util.logging.commons.CommonsLogger
//warn 警告: Form token EDZ4S96RNDN5VD8B1CQTK6FTHIJUPC66 does not match the session token null.
public String execute() {
List ls = new ArrayList();
ls.add(name);
for (int i = 0; i < ls.size(); i++) {
System.out.println(ls.get(i));
}
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
|
index.jsp表单页面
代码如下 |
复制代码 |
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>防止表单重复提交</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<!-- 防止表单重复提交,记得在form表单里填上<s:token></s:token> -->
<!-- action="token"、action="tokenSession" -->
<s:form action="token" namespace="/test" method="post">
姓名:<s:textfield name="name"/><s:token></s:token>
<input type="submit" value="发送"/>
</s:form>
</body>
</html>
|
message.jsp返回成功页面
代码如下 |
复制代码 |
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<s:property value="name"/><br/>
<%=new Date() %>
</body>
</html>
|
补充:Jsp教程,Java基础