防止表单重复提交(拦截器)
1、回顾之前的解决办法:
2、Struts2中的解决办法:
2.1、使用重定向
<result type="redirect">/success.jsp</result>
遗留的问题:防不住后退,再提交。
2.2、使用<s:token/>生成令牌配合token拦截器
<%@ 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>struts2中的表单重复提交</title>
</head>
<body>
<%--使用一个struts2的内置标签 s:token --%>
<s:form action="login1">
<s:token></s:token>
<s:textfield name="name" label="用户名" />
<s:submit value="提交"/>
</s:form>
</body>
</html>
.jsp
struts.xml 中配置 token拦截器
<action name="login" class="com.itheima.web.action.Demo1Action" method="login">
<!-- 由于默认的拦截器栈中没有令牌的拦截器,所以需要把默认的拦截器栈配上 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 使用struts2提供的一个令牌的拦截器:token -->
<interceptor-ref name="token"></interceptor-ref>
<!--<result>/success.jsp</result> 请求转发不行 -->
<result type="redirect">/success.jsp</result>
<result name="invalid.token">/message.jsp</result>
</action>
struts.xml
点击后退的时候,会提示
配置结果视图
遗留的问题:此种解决方式,是产生了错误之后再告知用户,你错了。
2.3、使用<s:token/>生成令牌配合tokensession拦截器
<action name="login1" class="com.itheima.web.action.Demo2Action" method="login">
<!-- 由于默认的拦截器栈中没有tokenSession的拦截器,所以需要把默认的拦截器栈配上 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 使用struts2提供的一个tokenSession的拦截器:token -->
<interceptor-ref name="tokenSession"></interceptor-ref>
<result type="redirect">/success.jsp</result>
</action>
struts.xml