不用struts2的token机制,手动防止表单数据重复提交


struts2的拦截器实现了防止表单重复提交的功能,即token拦截器,在表单提交页面写上<s:token/>,在struts.xml配置文件中相应的action上配置拦截器
此拦截器只能用在有form的提交请求上。如果是通过url链接请求action,就只能手动控制了。请参考“struts2中采用url链接的action请求如何防止重复提交”

//  配置如下
< action name = " cbApplySubmit "   class = " CBApplyAction "
            method
= " cbApplyFromSubmit " >
< interceptor - ref name = " tokenStack "   />
< result name = " input "  type = " ivTiles " >
                
< param name = " attMap " >
                    #
{'main':'/assets/businessChange/addChangeBusiness.jsp'}
                
</ param >
            
</ result >
< result type = " redirect-action "  name = " invalid.token " >
< param name = " actionName " > queryCB </ param >
< param name = " namespace " >/ assets / businessChange </ param >
</ result >

//  页面如下,注意要加在form里面
< s:form method = " POST "  action = " cbApplySubmit "  name = " anewApplyForm "  namespace = " /assets/businessChange " >
< s:token  />
// . //
</ s:form >


要是不使用struts2的拦截器,如何防止表单重复提交呢?在struts2里面实现比较简单

1.在跳转到表单填写页面的action里面往session放一个值
public  String execute()  throws  Exception {
//  向session中放置一个值
        ActionContext actionContext  =  ActionContext.getContext();
        Map session 
=  actionContext.getSession();
        session.put(
" session_value " , Math.random()  +   "" );

        
return  SUCCESS;
    }


2.在表单填写页面加上接收session值的隐藏域,sub是定义在action里面的一个属性,提供get set方法即可

< input type = " hidden "  name = " sub "  value = " ${session_value} " />

3.在action提交的方法中判断页面提交过来的sub是否不为空,并且等于从session中取出的session_value的值
如果满足,先移除session里的那个值,再执行提交表单操作;如果不满足,就是重复提交,不会提交表单

public  String cbApplyFromSubmit()  throws  Exception {
//  将页面hidden提交的值和session中的值比较
        ActionContext actionContext  =  ActionContext.getContext();
        Map session 
=  actionContext.getSession();
        String obj 
=  (String) session.get( " session_value " );
        
if  (sub  !=   null   &&  sub.equals(obj)) {
            session.remove(
" session_value " );
                        
//  保存数据
            chBusiness.saveCBApplyForm(changeApplyFormBO);
            
return  SUCCESS;
        } 
else  {
            
return   " invalid " ;
        }
    }


有时action请求不使用form提交,而是url方式,如下:

1                               < s:url id = " cabApply "  action = " userAffirm "
2                                  namespace = " /assets/businessChange " >
3                                   < s:param name = " cabinetId "  value = " %{cbCabinetsExeBO.id} " />
4                                   < s:param name = " formId "  value = " %{changeApplyFormBO.id} "   />
5                                   < s:param name = " subApplyExeType "  value = " %{'CABI'} "   />
6                                   < s:param name = " cabAffirmSession "  value = " #session.cabValue " />
7                               </ s:url >
8                               < s:a href = " %{cabApply} "  cssClass = " buttonBlue " >  用户确认  </ s:a >

其中所带参数cabAffirmSession是用来接收和传递action里面put到session中的值
cabValue是放到session中的值

在struts2 action中要使用session,最好的方式是实现SessionAware,这样不用每次要用时都要采用ServletActionContext.getContext().getSession()这种方式得到session

 1 public   class  CBApplyEditAction  extends  ActionSupport  implements  SessionAware {
 2    private Map session; 
 3    /** 用户确认action防止重复提交的URL所带参数名 */
 4    private String cabAffirmSession;
 5    
 6    private String moniAffirmSession;
 7    
 8    private String netAffirmSession;
 9    
10    private String sysAffirmSession;
11
12// 省略上面四个属性的get set方法
13
14    public void setSession(Map session) 
15           this.session = session; 
16        }
 
17
18    public String seeChBusiness() throws Exception {
19        // 往session中放值 
20        session.put("cabValue", Math.random() + "");
21        session.put("moniValue", Math.random() + "");
22        session.put("sysValue", Math.random() + "");
23        session.put("netValue", Math.random() + "");
24        
25        return "seeChBusiness";
26    }

27
28    public String userAffirm() throws Exception {
29        if (EChangeBusinessCategory.CABINETS_DEMAND.getKey().equals(
30                subApplyExeType)) {
31            // 将所带参数提交的值和session中的值比较
32            String obj = (String) session.get("cabValue");
33            if(cabAffirmSession!=null&&cabAffirmSession.equals(obj)){
34                session.remove("cabValue");
35                chBusiness.updateCabinetExecuteStatus(cabinetId,
36                        EChangeStatus.UserConfirm.getKey());
37                return SUCCESS;
38            }
else{
39                return "invalid";
40            }

41
42        }

43        if (EChangeBusinessCategory.MONITOR_DEMAND.getKey().equals(
44                subApplyExeType)) {
45            String obj = (String) session.get("moniValue");
46            if(moniAffirmSession!=null&&moniAffirmSession.equals(obj)){
47                session.remove("moniValue");
48                chBusiness.updateMonitorExecuteStatus(monitorId,
49                        EChangeStatus.UserConfirm.getKey());
50                return SUCCESS;
51            }
else{
52                return "invalid";
53            }

54        }

55        
56        if (EChangeBusinessCategory.NETWORK_DEMAND.getKey().equals(
57                subApplyExeType)) {
58            String obj = (String) session.get("netValue");        
59            if(netAffirmSession!=null&&netAffirmSession.equals(obj)){
60                session.remove("netValue");
61                chBusiness.updateNetworkExecuteStatus(networkId,
62                        EChangeStatus.UserConfirm.getKey());
63                return SUCCESS;
64            }
else{
65                return "invalid";
66            }

67        }

68        
69        if (EChangeBusinessCategory.SYSTEM_SETUP.getKey().equals(
70                subApplyExeType)) {
71            String obj = (String) session.get("sysValue");    
72            if(sysAffirmSession!=null&&sysAffirmSession.equals(obj)){
73                session.remove("sysValue");
74                chBusiness.updateServerExecuteStatus(serverId,
75                        EChangeStatus.UserConfirm.getKey());
76                return SUCCESS;
77            }
else{
78                return "invalid";
79            }

80        }

81        
82        return SUCCESS;
83    }

84
85


以上代码是进入页面的action时往session放一个随机数,double类型,提交请求的action中,判断页面带过来的值和session中是否相等,如果相等,移除session里的该值,执行操作;否则,返回另一个JSP页面
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值