此拦截器只能用在有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 >
< 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;
}
// 向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 " ;
}
}
// 将页面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方式,如下:
其中所带参数cabAffirmSession是用来接收和传递action里面put到session中的值
cabValue是放到session中的值
在struts2 action中要使用session,最好的方式是实现SessionAware,这样不用每次要用时都要采用ServletActionContext.getContext().getSession()这种方式得到session
以上代码是进入页面的action时往session放一个随机数,double类型,提交请求的action中,判断页面带过来的值和session中是否相等,如果相等,移除session里的该值,执行操作;否则,返回另一个JSP页面
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 >
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
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页面