- 浏览: 8868 次
- 性别:
- 来自: 深圳
文章分类
最新评论
防止表单重复提交主要用的到标签是<s: token />,拦截器 <interceptor-ref name="token" />,还有一个默认的返回值<result name="invalid.token">/input.jsp</result>
在页面加载时,<s: token />产生一个GUID(Globally Unique Identifier,全局唯一标识符)值的隐藏输入框如:
<input type="hidden" name="struts.token.name" value="struts.token"/>
<input type="hidden" name="struts.token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/>
同时,将GUID放到会话(session)中;在执行action之前,“token”拦截器将会话token与请求token比较,如果两者相同,则将会话中的token删除并往下执行,否则向actionErrors加入错误信息。如此一来,如果用户通过某种手段提交了两次相同的请求,两个token就会不同。
下面用零配置来演示 token的作用
/WEB-INF/content/test-success.jsp
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
</head>
<body>
<s:actionerror/>
<s:form action="test!save.action" method="POST">
<s:textfield name="message" label="请输入您的信息"/>
<s:token name="token"/>
<s:submit value="确定" />
</s:form>
</body>
</html>
/WEB-INF/content/error.jsp
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<s:actionerror/>
不能重复提交表单!
</body>
</html>
/WEB-INF/content/test-ok.jsp
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
SAVE OK!
</body>
</html>
TestAction.java
package com.fun.actions;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;
@Results({
@Result(name="invalid.token",location="/index.html",type="redirect")})
@InterceptorRefs({@InterceptorRef(value="token",params={"includeMethods","save"}),@InterceptorRef("defaultStack") })
public class TestAction extends ActionSupport {
private String message;
public String execute(){
return SUCCESS;
}
public String save(){
return "ok";
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
其实,最主要的就是 token拦截器中还有 includeMethods()这个方法,表示的是,Action中的哪个方法需要经过拦截器。属性excludeMethods()这个方法表示的是哪个方法不经过拦截器。如果,没有加上“defaultStack”这个拦截器的话,则ActionContext的值将为null。
http://www.qudong.com/soft/program/jsp/jiqiaoyunyong/20080317/822.html
在页面加载时,<s: token />产生一个GUID(Globally Unique Identifier,全局唯一标识符)值的隐藏输入框如:
<input type="hidden" name="struts.token.name" value="struts.token"/>
<input type="hidden" name="struts.token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/>
同时,将GUID放到会话(session)中;在执行action之前,“token”拦截器将会话token与请求token比较,如果两者相同,则将会话中的token删除并往下执行,否则向actionErrors加入错误信息。如此一来,如果用户通过某种手段提交了两次相同的请求,两个token就会不同。
下面用零配置来演示 token的作用
/WEB-INF/content/test-success.jsp
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
</head>
<body>
<s:actionerror/>
<s:form action="test!save.action" method="POST">
<s:textfield name="message" label="请输入您的信息"/>
<s:token name="token"/>
<s:submit value="确定" />
</s:form>
</body>
</html>
/WEB-INF/content/error.jsp
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<s:actionerror/>
不能重复提交表单!
</body>
</html>
/WEB-INF/content/test-ok.jsp
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
SAVE OK!
</body>
</html>
TestAction.java
package com.fun.actions;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;
@Results({
@Result(name="invalid.token",location="/index.html",type="redirect")})
@InterceptorRefs({@InterceptorRef(value="token",params={"includeMethods","save"}),@InterceptorRef("defaultStack") })
public class TestAction extends ActionSupport {
private String message;
public String execute(){
return SUCCESS;
}
public String save(){
return "ok";
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
其实,最主要的就是 token拦截器中还有 includeMethods()这个方法,表示的是,Action中的哪个方法需要经过拦截器。属性excludeMethods()这个方法表示的是哪个方法不经过拦截器。如果,没有加上“defaultStack”这个拦截器的话,则ActionContext的值将为null。
http://www.qudong.com/soft/program/jsp/jiqiaoyunyong/20080317/822.html
- 详细设计文档_2011111.rar (2.3 MB)
- 下载次数: 7
- struts2_异常处理.rar (56.1 KB)
- 下载次数: 4
- JNDI配置.rar (11.5 KB)
- 下载次数: 2
- JNDI配置.rar (11.5 KB)
- 下载次数: 2
发表评论
-
jndi.properties文件配置
2011-12-20 01:17 1666jndi.properties文件为所有Initial Con ... -
Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法
2011-09-18 23:56 1264在使用Hibernate的原生态SQL对Oracle进行查询时 ... -
WEB1111
2011-09-10 00:11 14WEB1111WEB1111WEB1111WEB1111 -
public PageBean getPage() {
2011-09-08 18:26 7public PageBean getPage() { -
frame
2011-08-28 23:52 564<frameset rows="20%,*,8 ... -
WSAD与WebSphere中一步步配置JNDI
2011-08-15 18:51 647在WSAD中配置服务器数据源以及使用数据源连接数据库的步骤如下 ... -
定位到行
2011-07-15 15:42 554//定位到行 function goto(tln) { i ... -
Timer
2011-06-30 16:54 546public class TimerTasks { pub ... -
public static Exception getExceptionObj(Throwable exception)
2011-06-28 20:42 0public static Exception getExce ... -
public static Exception getExceptionObj(Throwable exception)
2011-06-28 17:25 1public static Exception getExce ... -
<!-- 结果集一一对应映射 resultMap是一个容器,用来装从数据库中获得的数据 -->
2011-06-27 17:41 1<!-- 结果集一一对应映射 resultMap是一个容 ...
相关推荐
struts2令牌
非常详细的案例,有注释,有代码,可以成功运行
struts2 令牌使用例子 直接导入使用
struts2令牌解决页面重复提交问题,资源中包含一个实例代码
专门为struts打造的,有效的防止重复提交,并且操作起来相当方便……
关于讲解struts令牌详细介绍 解决页面重复提交的好方式
关于struts2的运行机制,适合初学者
Struts2工作机制,对于公司面试应聘者来说是比较常问的东西,里面有形象的图例解释,相信对你有所帮助的!
Struts2异常处理机制
NULL 博文链接:https://finally-m.iteye.com/blog/360648
struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别...
Struts2漏洞利用工具2019版 V2.3.zip
Struts终极漏洞利用工具 Powered By 独孤城 Thanks to 峙酿君edwardz
struts2 struts2 漏洞利用工具
[浪曦原创]Struts系列 第9讲 Struts的令牌使用(zk001)
简单的struts2令牌token实例 方便应用 不懂token也可以参考学习 主要用于解决重复提交的问题
K8 Struts2 Exp 20160516(Struts2综合漏洞利用工具)