关于Struts的Token

Struts防重复提交

请求有效性处理,使用令牌可以有效的防止重复提交。
protected String generateToken(HttpServletRequest request) 创建一个令牌.
protected boolean isTokenValid(HttpServletRequest request) 检查令牌是否有效
protected boolean isTokenValid(HttpServletRequest request,Boolean reset) 检查令牌是否有效,并且重置令牌(如果reset 是true)
protected void resetToken(HttpServletRequest request) 重置令牌
protected void saveToken(HttpServletRequest request) 添加令牌

 

基本原理:

服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,
看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给
客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次
提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。

 

 实例:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->/*
 * Generated by MyEclipse Struts
 * Template path: templates/java/JavaClass.vtl
 
*/
package com.yourcompany.struts.action;

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;

/** 
 * MyEclipse Struts
 * Creation date: 08-01-2008
 * 
 * XDoclet definition:
 * @struts.action validate="true"
 * @struts.action-forward name="add" path="/add.jsp"
 
*/
public class ToAddAction extends Action {
    
/*
     * Generated Methods
     
*/

    
/** 
     * Method execute
     * 
@param mapping
     * 
@param form
     * 
@param request
     * 
@param response
     * 
@return ActionForward
     
*/
    
public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) {
    
// TODO Auto-generated method stub
    saveToken(request);
    
return mapping.findForward("add");
    }
}

 

这个Action主要作用就是在跳转的页面上加入Token,只有加入Token才能实现Token的验证。执行完这个Action后,跳转到的页面会出现类似如下的一个hidden控件

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="b030d9188a218097211d9061907cde5d"></div>

 

那么恭喜你,Token生效拉,注意,跳转到的页面里面,表单指可以用Struts标签来生成,不可以用HTML来生成,不然Token是无效的。

 

使用Token的第一步完成,第二步,在提交的Action中验证Token是否符合,代码如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->/*
 * Generated by MyEclipse Struts
 * Template path: templates/java/JavaClass.vtl
 
*/
package com.yourcompany.struts.action;

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;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import com.lc.sqlhelp.Access;
import com.yourcompany.struts.form.AddForm;

/**
 * MyEclipse Struts Creation date: 08-01-2008
 * 
 * XDoclet definition:
 * 
 * @struts.action path="/add" name="addForm" input="/form/add.jsp"
 *                scope="request" validate="true"
 * @struts.action-forward name="add_suc" path="/add_suc.jsp"
 * @struts.action-forward name="add_fail" path="/add_fail.jsp"
 
*/
public class AddAction extends Action {
    
/*
     * Generated Methods
     
*/

    
/**
     * Method execute
     * 
     * 
@param mapping
     * 
@param form
     * 
@param request
     * 
@param response
     * 
@return ActionForward
     
*/
    
public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) {
    AddForm af 
= (AddForm) form;
    
if (isTokenValid(request, true))//验证Token是否符合要求
 {
        String sql 
= "insert into user (username,password) values('"
            
+ af.getUsername() + "','" + af.getPassword() + "')";
        System.out.println(sql);
        Access sh 
= new Access();
        sh.loadMyDriver();
        sh.setMyConnection();
        sh.createMyStatement();
        sh.executeMyUpdata(sql);
        sh.closeMyStatement();
        sh.closeMyConnection();
        
return mapping.findForward("add_suc");
    }
    
return mapping.getInputForward();
    }
}

 

这样就完成了防止表单重复提交的功能。

实例源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值