掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
IBATIS是一款優(yōu)秀的ORM框架,被廣泛應(yīng)用于Java Web項目中。在Web開發(fā)中,很多場景下需要提交表單數(shù)據(jù)到數(shù)據(jù)庫中,但是由于網(wǎng)絡(luò)等各種原因,可能會造成表單數(shù)據(jù)被重復(fù)提交,導(dǎo)致數(shù)據(jù)庫出現(xiàn)重復(fù)數(shù)據(jù)。因此,如何避免表單數(shù)據(jù)重復(fù)提交成為Web開發(fā)中的一個重要問題。本文將介紹一種在IBATIS中實現(xiàn)數(shù)據(jù)庫提交避免重復(fù)提交的方法。

目前創(chuàng)新互聯(lián)公司已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站改版維護、企業(yè)網(wǎng)站設(shè)計、陵城網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
1. 原理
在Web開發(fā)中,避免表單數(shù)據(jù)重復(fù)提交的方法通常是采用token機制。即當表單頁面被加載時,服務(wù)器生成一個隨機的token值,把該值存儲在session中,并將該token值作為表單數(shù)據(jù)提交時的一個參數(shù)。當用戶提交表單數(shù)據(jù)時,服務(wù)器會校驗該token值和Session中的token值是否一致,若一致,則表示該表單數(shù)據(jù)是之一次提交,可以直接保存到數(shù)據(jù)庫中;若不一致,則表示該表單數(shù)據(jù)已經(jīng)提交過了,需要返回錯誤提示。
在IBATIS中,可以使用攔截器機制實現(xiàn)token校驗。攔截器是一種AOP(面向切面編程)的方式,可以在方法執(zhí)行前后自定義一些操作。在IBATIS中,可以使用SqlMapClient攔截器,對數(shù)據(jù)庫操作進行攔截,實現(xiàn)token校驗和提交數(shù)據(jù)操作。
2. 實現(xiàn)步驟
(1)在SqlMapConfig.xml中配置攔截器
“`
…
“`
(2)實現(xiàn)攔截器類
“`
public class TokenInterceptor extends AbstractSqlMapClientInterceptor {
// token值在session中的key
private static final String TOKEN_KEY = “token”;
// token值在表單數(shù)據(jù)中的key
private static final String TOKEN_PARAM = “token”;
@Override
public Object intercept(Object obj, Method method, Object[] args, InterceptorChn chn)
throws SQLException {
if (method.getName().equals(“update”)) {
// 獲取表單提交數(shù)據(jù)中的token值
String token = null;
for (Object arg : args) {
if (arg instanceof Map) {
Map map = (Map) arg;
token = (String) map.get(TOKEN_PARAM);
break;
}
}
if (token != null) {
// 獲取Session中的token值
String sessionToken = (String) ActionContext.getContext().getSession().get(TOKEN_KEY);
// 如果兩個token值相同,則表示表單數(shù)據(jù)沒有重復(fù)提交,可以執(zhí)行數(shù)據(jù)庫操作
if (sessionToken != null && sessionToken.equals(token)) {
// 執(zhí)行數(shù)據(jù)庫操作
Object result = chn.intercept(obj, method, args);
// 在執(zhí)行完后,從Session中移除該token值
ActionContext.getContext().getSession().remove(TOKEN_KEY);
return result;
} else {
// 如果兩個token值不同,則表示該表單數(shù)據(jù)已經(jīng)提交過了,不需要重復(fù)提交
throw new SQLException(“數(shù)據(jù)重復(fù)提交”);
}
}
}
// 如果執(zhí)行的不是update操作,則直接執(zhí)行
return chn.intercept(obj, method, args);
}
}
“`
(3)在Action類中生成token值
在Action類中,生成一個隨機的token值,并將該值存儲在Session中。以Struts2框架為例:
“`
public class MyAction extends ActionSupport {
@Override
public String execute() throws Exception {
// 生成一個隨機的token值
String token = UUID.randomUUID().toString();
// 將該token值存儲在Session中
ActionContext.getContext().getSession().put(TokenInterceptor.TOKEN_KEY, token);
// 返回結(jié)果頁面
return SUCCESS;
}
}
“`
(4)在P頁面中提交表單數(shù)據(jù)時加入token值
在P頁面中,提交表單數(shù)據(jù)時加入一個token參數(shù),值為Session中的token值。以Struts2框架為例:
“`
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,響應(yīng)式網(wǎng)站制作,設(shè)計師量身打造品牌風(fēng)格,熱線:028-86922220
Element type “SqlMap” must be declared
SqlMapConfig.xml中未首山宏配置sql映射文件
ibatis提交重復(fù)數(shù)據(jù)庫的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于ibatis提交重復(fù)數(shù)據(jù)庫,IBATIS數(shù)據(jù)庫提交避免重復(fù)提交的方法,用ibatis連接數(shù)據(jù)庫遇到這樣的問題怎么解決的信息別忘了在本站進行查找喔。
成都創(chuàng)新互聯(lián)科技公司主營:網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、小程序制作、成都軟件開發(fā)、網(wǎng)頁設(shè)計、微信開發(fā)、成都小程序開發(fā)、網(wǎng)站制作、網(wǎng)站開發(fā)等業(yè)務(wù),是專業(yè)的成都做小程序公司、成都網(wǎng)站建設(shè)公司、成都做網(wǎng)站的公司。創(chuàng)新互聯(lián)公司集小程序制作創(chuàng)意,網(wǎng)站制作策劃,畫冊、網(wǎng)頁、VI設(shè)計,網(wǎng)站、軟件、微信、小程序開發(fā)于一體。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流