使用struts1和struts2的同步令牌token避免form的重复提交
来源:互联网 发布:debian软件源 编辑:程序博客网 时间:2024/06/05 11:28
一、使用方法
1、 假如你要提交的页面为toSubmit.jsp;
2、 在打开toSubmit.jsp的Action1中加入:saveToken(request),例如
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
//生成同步令牌
saveToken(request);
return mapping.findForward("toSubmit");
}
3、 在提交toSubmit.jsp的Action2中加入:isTokenValid(request, true),例如:
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// 验证同步令牌
if (isTokenValid(request, true)) {
//执行提交操作
}else {
// 重复提交
return mapping.findForward("Error");
}
}
4、 使用注意:toSubmit.jsp中的form必须使用struts的标签<html:form>。
二、基本原理
第一步、在session中放入同步令牌
在Action1中加入了saveToken(request)的方法后,调用TokenProcessor类的saveToken方法如下:
public synchronized void saveToken(HttpServletRequest request) {
HttpSession session = request.getSession();
String token = generateToken(request);
if (token != null) {
session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);
}
}
很明显在session中放入了同步令牌,名称为Globals.TRANSACTION_TOKEN_KEY。
第二步、在页面创建hidden元素
当应用服务器初始化toSubmit.jsp页面遇到标签<html:form>时,便会调用struts的FormTag类,其中有一个方法:
protected String renderToken() {
StringBuffer results = new StringBuffer();
HttpSession session = pageContext.getSession();
if (session != null) {
String token =
(String) session.getAttribute(Globals.TRANSACTION_TOKEN_KEY);
if (token != null) {
results.append("<input type=\"hidden\" name=\"");
results.append(Constants.TOKEN_KEY);
results.append("\" value=\"");
results.append(token);
if (this.isXhtml()) {
results.append("\" />");
} else {
results.append("\">");
}
}
}
return results.toString();
}
其意为:当检测到session中的Globals.TRANSACTION_TOKEN_KEY不为空时,在toSubmit.jsp页面创建元素:
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="">
名称为:org.apache.struts.taglib.html.TOKEN就是Constants.TOKEN_KEY;
值为:session中的Globals.TRANSACTION_TOKEN_KEY的值,即为同步令牌值。
第三步、验证同步令牌
在Action2中加入isTokenValid方法,实际上是调用TokenProcessor类的isTokenValid方法如下:
public synchronized boolean isTokenValid(
HttpServletRequest request,
boolean reset) {
// Retrieve the current session for this request
HttpSession session = request.getSession(false);
if (session == null) {
return false;
}
// Retrieve the transaction token from this session, and
// reset it if requested
String saved = (String) session.getAttribute(Globals.TRANSACTION_TOKEN_KEY);
if (saved == null) {
return false;
}
if (reset) {
this.resetToken(request);
}
// Retrieve the transaction token included in this request
String token = request.getParameter(Constants.TOKEN_KEY);
if (token == null) {
return false;
}
return saved.equals(token);
}
它首先取得session中的令牌值,然后resetToken,再从页面hidden元素取来令牌值,进行比较,如果相等则为第一次,不等则为重复提交。
其中resetToken方法如下:
public synchronized void resetToken(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session == null) {
return;
}
session.removeAttribute(Globals.TRANSACTION_TOKEN_KEY);
}
实例
http://blog.csdn.net/xianqiang1/article/details/8099384
Struts2 里的token 防止重复提交
在页面上加上 <s:token name=”token”></s:token> 这样就可以了,但是在struts.xml 里加上token 拦截器,<interceptor-ref name=”token” ></interceptor>
现加上默认的拦截器 <interceptor-ref name=”defaultStack”> </interceptor>
这样就OK了,但是在页面显示的英文 ,
The form has already been processed or no token was supplied, please try again.
如何定义成自己想要的呢?这个不难,你找到 struts2-core.jar
打开这个文件找到 org.apache.struts2 下里面有一个 struts-message.properties的文件,打开看看里面是否有一个
struts.messages.invalid.token=The form has already been processed or no token was supplied, please try again.
好了,前面的Key就是我们想要的struts.messages.invalid.token 把它复制到你定义的 .properties 文件里,struts.messages.invalid.token = \u5bf9\u4e0d\u8d77\uff0c\u4e0d\u80fd\u91cd\u590d\u63d0\u4ea4
这回看看是不是好了,呵呵。
- 使用struts1和struts2的同步令牌token避免form的重复提交
- 使用struts的同步令牌避免form的重复提交
- 使用struts的同步令牌避免form的重复提交
- 使用struts同步令牌机制避免表单的重复提交
- 使用struts同步令牌机制避免表单的重复提交
- 使用struts同步令牌机制避免表单的重复提交
- 使用struts同步令牌机制避免表单的重复提交
- 利用struts的同步令牌机制避免form的重复提交
- 利用struts的同步令牌机制避免form的重复提交
- Struts2 token的使用,避免表单重复提交
- 我对servlet+jsp当中使用token令牌避免用户重复提交表单的见解
- Struts2 避免重复提交 [Token]
- STRUTS中利用同步令牌(Token)解决重复提交的问题(转载)
- Struts中利用同步令牌(Token)解决重复提交的问题
- struts2 采用Session Token(Token 令牌)避免表单重负提交
- 使用token在服务器端避免表单的重复提交
- struts2中使用Token避免表单重复提交
- php 解决和避免form表单重复提交的方法
- gdb常用命令
- SQL 先分组后排序 然后每组取最大一行
- Eclipse Alt+/ Content Assistant
- C语言位段
- jquery表单验证
- 使用struts1和struts2的同步令牌token避免form的重复提交
- HDU1397:Goldbach's Conjecture
- Web Service
- 年青用户转向手机消息应用 或威胁Facebook地位
- 银行业务调度系统
- C++ STL set和multiset的使用
- C++类构造函数详解
- ORACLE 之 闪回
- 投票统计—投票过滤器类的设计与实现