使用struts同步令牌机制避免表单的重复提交
来源:互联网 发布:oracle数据库权限分配 编辑:程序博客网 时间:2024/05/21 07:49
一、使用方法
1、假设你要提交的叶面为usermesg.jsp。
2、在打开usermesg.jsp的SaveTokenAction中加入saveToken(request),源码如下:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class SaveToken extends Action ...{
/**//* forward name="usermesg" path="/usermesg.jsp" */
private final static String USERMESG = "usermesg";
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception ...{
// 在session中放入同步令牌
saveToken(request);
// TODO process request and return an ActionForward instance, for example:
// return mapping.findForward(USERMESG);
return mapping.findForward(USERMESG);
}
}
3、在叶面提交的ValidatorAction中加入isTokenValid(request,true)源码如下:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class Validator extends Action ...{
private final static String ERROR="error";
private final static String WELCOME="welcome";
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception ...{
// 验证同步令牌
if(isTokenValid(request,true))...{
return mapping.findForward(WELCOME);
}else...{
return mapping.findForward(ERROR);
}
// TODO process request and return an ActionForward instance, for example:
// return mapping.findForward("forward_name");
}
}
4、 使用注意:usermesg.jsp中的form表单必须使用struts的标签<html:form> 。
二、基本原理
1、在session中放入同步令牌。原理:调用TokenProcessor类的saveToken(HttpServletRequest arg0);源码如下:
在sesssion中放入名称为Globale.TRANSACTION_TOKEN_KEY的同步令牌:token
public synchronized void saveToken(HttpServletRequest request)...{
HttpSession session=request.getSession();
String token=generateToken(request);
if(token!=null)...{
session.setAttribute(Globale.TRANSACTION_TOKEN_KEY,token);
}
}
2、在打开usermesg.jsp时,应用服务器遇到<html:form>时,便会调用FormTag类的renderToken()方法创建hidden元素。源码如下:
protected String renderToken()...{
StringBuffer result=new StringBuffer();
HttpSession session=pageContext.getSession();
if(session!=null)...{
String token=(String)session.getAttribute(Globale.TRANSACTION_TOKEN_KEY);
if(token!=null)...{
result.append("<input type="hidden" name="");
result.append(Constants.TOKEN_KEY);
result.append("" value="");
result.append(token);
if(this.isXhtml)...{
result.append("" />");
}else...{
result.append("" >");
}
}
}
return result.toStriong();
}
hidden元素Constants.TOKEN_KEY的值就是session中的名称为Globale.TRANSACTION_TOKEN_KEY的同步令牌值
3、验证同步令牌,原理:调用TokenProcessor的isTokenValid(HttpServletRequest arg0,boolean arg1)源码如下:
public synchronized boolean isTokenValid(HttpServletRequest request,boolean reset)...{
HttpSession session request.getSession(false);
if(session==null) return false;
String saved=(String)session.getAttribute(Globale.TRANSACTION_TOKEN_KEY);
if(saved==null) return false;
if(reset) this.resetToken(request);
String token=request.getParameter(Constants.TOKEN_KEY);
if(token==null) return false;
return saved.equals(token);
}
从叶面取出同步令牌值和session中的进行比较。如果相等则为第一次,不等就是重复提交。前提就是传进来的参数reset必须是true。不然每次都相同。其中resetToken()方法如下:
public synchronized void resetToken(HttpServletRequest request)...{
HttpSession session request.getSession(false);
if(session==null)...{
return;
}
session.removeAttribute(Globale.TRANSACTION_TOKEN_KEY);
}
这就是在isTokenValid方法中boolean参数的作用:清除session中的同步令牌,避免重复提交。如果把true改为false 将不会起到避免重复提交的作用
扎客小站:www.ezhake.com
- 使用struts同步令牌机制避免表单的重复提交
- 使用struts同步令牌机制避免表单的重复提交
- 使用struts同步令牌机制避免表单的重复提交
- 使用struts同步令牌机制避免表单的重复提交
- 使用struts的同步令牌避免form的重复提交
- 使用struts的同步令牌避免form的重复提交
- 利用struts的同步令牌机制避免form的重复提交
- 利用struts的同步令牌机制避免form的重复提交
- struts令牌的使用 防止表单重复提交
- Struts的Token(令牌)机制解决表单重复提交的问题
- Struts的Token(令牌)机制解决表单重复提交的问题
- 我对servlet+jsp当中使用token令牌避免用户重复提交表单的见解
- 使用struts1和struts2的同步令牌token避免form的重复提交
- struts2的防止表单重复提交的令牌机制
- Token(令牌) 机制(表单重复提交)
- Struts2 令牌机制防止 表单重复提交
- Java 令牌机制 防止表单重复提交
- 使用Struts的Token机制解决表单的重复提交
- Spring基本功能详解
- UNIX环境高级编程-环境配置(简化版)
- 【读书笔记】OpenGL中的矩阵运算
- Linux的系统级性能剖析工具-perf
- 经典SQL语句大全
- 使用struts同步令牌机制避免表单的重复提交
- 去视频网站的广告
- 直接插入排序
- Hibernate 第十讲 表关联关系(一)单项一对一外键关联
- Struts2自定义拦截器和检验器
- Hadoop
- java中list、set和map 的区别
- window.open(转)
- JSF 2.0(基于Primefaces 3.4.2) 中文乱码的处理方案