实现原理:一致性。jsp生成表单时,在表单中插入一个隐藏<input>字段,该字段就是保存在页面端的token字符串,同时把该字符串存入session中。等到用户提交表单时,会一并提交该隐藏的token字符串。在服务器端,查看下是否在session中含有与该token字符串相等的字符串。如果有,那么表明是第一次提交该表单,然后删除存放于session端的token字符串,再做正常业务逻辑流程;如果没有,那么表示该表单被重复提交,做非正常流程处理,可以警告提示也可以什么也不做。
首先是Token主类。
package com.paizuo.framework.util;
import java.util.ArrayList;
import javax.servlet.http.HttpSession;
public class Token {
private static final String TOKEN_LIST_NAME = "tokenList";
public static final String TOKEN_STRING_NAME = "token";
private static ArrayList getTokenList(HttpSession session) {
Object obj = session.getAttribute(TOKEN_LIST_NAME);
if (obj != null) {
return (ArrayList) obj;
} else {
ArrayList tokenList = new ArrayList();
session.setAttribute(TOKEN_LIST_NAME, tokenList);
return tokenList;
}
}
private static void saveTokenString(String tokenStr, HttpSession session) {
ArrayList tokenList = getTokenList(session);
tokenList.add(tokenStr);
session.setAttribute(TOKEN_LIST_NAME, tokenList);
}
private static String generateTokenString(){
return new Long(System.currentTimeMillis()).toString();
}
public static String getTokenString(HttpSession session) {
String tokenStr = generateTokenString();
saveTokenString(tokenStr, session);
return tokenStr;
}
public static boolean isTokenStringValid(String tokenStr, HttpSession session) {
boolean valid = false;
if(session != null){
ArrayList tokenList = getTokenList(session);
if (tokenList.contains(tokenStr)) {
valid = true;
tokenList.remove(tokenStr);
}
}
return valid;
}
}
在jsp页面端。
首先import该类:
<%@ page import="com.paizuo.framework.util.Token" %>
表单包含隐藏的token字符串:
<input type="hidden" name="<%=Token.TOKEN_STRING_NAME %>" value="<%=Token.getTokenString(session) %>">
在Server端action中进行检验。
//进行正常业务流程
}
else{
//进行防重复提交处理流程
}
小记:原来以为通过
value="<%=Token.getTokenString(session) %>"这种jsp写法重复提交时request会重新读一下数据,那样就实现不了这个token的功能了,但是实验以后发现只要没有重回页面,request保存的值跟上一次提交的值完全相同(当然前提是不去改session里值,那些setSttribute之类的做法都无效)
相关推荐
BBS-- STRUTS1.2BBS-- STRUTS1.2BBS-- STRUTS1.2BBS-- STRUTS1.2BBS-- STRUTS1.2
包含Struts2框架的核心类库,以及Struts2的第三方插件类库 struts2-core-2.0.14 xwork-2.0.7 ognl-2.6.11 commons-logging-1.0.4 freemarker-2.3.8 等等。
spring-webmvc-struts.jar对Struts和Spring整合时需要用到的包
跟我学Java_Web--Struts2技术详解,跟我学Java_Web--Struts2技术详解
Extjs4---grid的修改、删除功能---结合struts2、hibernate
Java框架---Struts2 jar包,用于Struts2开发
Struts2学习之二--Struts2标签介绍
精通java Web开发--基于Struts EJB.zip 随书光盘 精通java Web开发--基于Struts EJB.zip 随书光盘
Java项目案例--基于Struts+hibernate网上书城系统,包含有代码。
java struts2入门学习实例--使用struts2快速实现多个文件上传
J2EE电子商务系统开发从入门到精通--基于Struts和Hibernate技术实现
里面有个webapps目录,该目录下的struts-documentation.war里就已经包含有struts的api文档
计算机-后端-基于Struts架构的视频点播系统的设计与实现.pdf
struts2官方例子10--Struts2的Form标签
完整OA系统--基于struts2,hibernate,spring3
计算机-后端-基于Struts扩展架构的大型Web应用系统设计与实现.pdf
计算机-后端-基于Struts和Hibernate框架构建Web应用的研究与实现.pdf
计算机-后端-基于STRUTS架构的外汇交易管理系统的设计与实现.pdf
计算机-后端-基于Struts架构的人力资源管理系统的研究与实现.pdf
深入struts 深入struts 深入struts