摘要:現(xiàn)象項目組一妹子程序員求助,說有,有一個值明明設(shè)置的是,但是存到數(shù)據(jù)庫里面卻會自動變成,嘗試了各種調(diào)整也找不原因,都快急瘋了我以前確實沒有研究過源碼,本著專研問題的精神,決定通過對一探究竟。
現(xiàn)象
??項目組一妹子程序員求助,說mybatis有bug,有一個值明明設(shè)置的是A.prop1=XXX,但是存到數(shù)據(jù)庫里面卻會自動變成A.prop1=true,嘗試了各種調(diào)整也找不原因,都快急瘋了!我以前確實沒有研究過mybatis源碼,本著專(ba)研(mei)問(zhuang)題(b)的精神,決定通過debug對mybais一探究竟。
定位??debugDao的入口類便是org.apache.ibatis.binding.MapperProxy ,可以看到它實現(xiàn)了InvocationHandler,很明顯mybatis使用了jdk的動態(tài)代理,參見查看我以前關(guān)于動態(tài)代理類的培訓(xùn)ppt如下,那么它一定有地方使用了newProxyInstance生成代理類,果然在MapperProxyFactory中就可以找到對應(yīng)的方法,只不過這次動態(tài)代理是對純接口進行代理,而不是對實現(xiàn)類代理(當(dāng)然滿足動態(tài)代理中被代理類需要實現(xiàn)接口的要求了?。?br>
??進入到MapperMethod中的execute方法,可以看到mybatis對select、update、delete、insert有不同的分支處理:
??進入到出問題的update方法中,可以定位到sqlSession.update執(zhí)行時修改了傳入的參數(shù)值,把XXX改成了true,這個update方法到底藏了什么玄機?繼續(xù)進入,發(fā)現(xiàn)sqlSession也是spring sessionTemplate生成的一個動態(tài)代理,主要是增加獲取鏈接和事物操作,通過代理層的操作,進入Mybatis的DefaultSqlSession中,接下來就是Mybatis預(yù)編譯要動態(tài)生成sql語句了,在動態(tài)生成語句時終于最終定位到了罪魁禍?zhǔn)譱fSqlNode.apply方法(整體調(diào)用棧見下圖)!
??mybatis中會根據(jù)mapper文件生成一個SqlNodeTree,然后根據(jù)入?yún)⒌臄?shù)據(jù)有選擇的生成最終的SQL,例如mapper文件中支持
??進入到具體的判斷方法內(nèi)部,發(fā)現(xiàn)了原來這邊判斷if test是使用的Ognl表達式引擎啊,Ognl是一個功能非常強大的JAVA表達式引擎,但是由于過于強大了,導(dǎo)致使用它的Struts2漏洞漫天飛,你Http請求中傳參"Runtime.getRuntime.exec("shutdown")",它真的就給你執(zhí)行關(guān)機了你敢信!!。
/* */ public boolean evaluateBoolean(String expression, Object parameterObject) /* */ { /* 29 */ Object value = OgnlCache.getValue(expression, parameterObject); /* 30 */ if (value instanceof Boolean) return ((Boolean)value).booleanValue(); /* 31 */ if (value instanceof Number) return (!(new BigDecimal(String.valueOf(value)).equals(BigDecimal.ZERO))); /* 32 */ return (value != null); /* */ }
??敏銳的我對著expression看了一遍又一遍,突然,我眼花了么?
A.prop1=!null ! A.prop1=!null !! A.prop1=!null !!!
??你妹啊! "!="寫成了"=!"!ognl又一次立功了,在需要它判斷的時候,它忠實的執(zhí)行了賦值(怪OGNL不怪妹子是幾個意思?),修改了mapper文件中的錯誤,終于恢復(fù)了正常!
擴展??上網(wǎng)搜索下看看有沒有犯同樣錯誤的同學(xué),沒想到還真有人在mybatis中這樣玩OGNL的,根據(jù)if test判斷的結(jié)果給table名賦值,無疑是提供了一種嶄(hun)新(luan)的思路?。?br>??給你們這些挖坑的跪了!
select from ${dynamicTableName }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77210.html
摘要:支持的語法用于解析靜態(tài)方法解析表達式在映射語句中可以支持引入以下幾種方式示例變量屬性靜態(tài)方法無參數(shù)待參數(shù)靜態(tài)屬性數(shù)組索引集合構(gòu)造方法的靜態(tài)方法可以省略的編寫,方法的默認(rèn)是包下的靜態(tài)方法可以省略的編寫,類默認(rèn)的是語法中通過兩個字符,前者 Mybatis支持OGNL的語法 OgnlCache 用于解析靜態(tài)方法org.apache.ibatis.scripting.xmltags.TextS...
摘要:執(zhí)行沒有,批處理不支持,將所有都添加到批處理中,等待統(tǒng)一執(zhí)行,它緩存了多個對象,每個對象都是完畢后,等待逐一執(zhí)行批處理。 Mybatis常見面試題 #{}和${}的區(qū)別是什么? #{}和${}的區(qū)別是什么? 在Mybatis中,有兩種占位符 #{}解析傳遞進來的參數(shù)數(shù)據(jù) ${}對傳遞進來的參數(shù)原樣拼接在SQL中 #{}是預(yù)編譯處理,${}是字符串替換。 使用#{}可以有效的防止...
摘要:問題描述最近通知應(yīng)用在近三個月內(nèi)出現(xiàn)過次緩存的問題,第一次在重啟之后一直沒有出現(xiàn)過問題,所以也沒有去重視,但是最近又出現(xiàn)過一次,看來很有必要徹底排查一次具體的錯誤日志如下具體表現(xiàn)就是出現(xiàn)此異常之后連續(xù)的出現(xiàn)大量此異常 問題描述最近通知應(yīng)用在近三個月內(nèi)出現(xiàn)過2次DNS緩存的問題,第一次在重啟之后一直沒有出現(xiàn)過問題,所以也沒有去重視,但是最近又出現(xiàn)過一次,看來很有必要徹底排查一次;具體的錯...
摘要:在軟件世界里,觀察意味著設(shè)置斷點添加調(diào)試語句監(jiān)視程序值以及檢查內(nèi)存在醫(yī)學(xué)領(lǐng)域,需要測試血樣和進行光透視。福爾摩斯,最后一案如果你不修復(fù),它不會自動消失。修復(fù)解決問題的能力,是軟件工程師的核心競爭力之一。 這篇文章是《調(diào)試九法:軟硬件錯誤的排查之道》的閱讀筆記。這本書的主旨,是介紹如何修復(fù)bug:找出bug發(fā)生的原因、并給出修復(fù)方案。 調(diào)試bug的九個規(guī)則列舉如下,建議將這個清單打印出來...
摘要:核心包包名稱包內(nèi)內(nèi)容簡介注解目錄。如等類的實例反射生成工具目錄主要是注解,和的構(gòu)造器及轉(zhuǎn)換器內(nèi)部緩存接口。等默認(rèn)的游標(biāo)處理類數(shù)據(jù)源工廠類及實現(xiàn)。數(shù)據(jù)源實現(xiàn)類自定義的三個異常類。。都繼承自執(zhí)行器相關(guān)包。為后續(xù)分析源碼打下基礎(chǔ)。 Mybatis核心包 showImg(https://segmentfault.com/img/remote/1460000018747383?w=746&h=1...
閱讀 887·2021-11-25 09:44
閱讀 1115·2021-11-19 09:40
閱讀 7231·2021-09-07 10:23
閱讀 2011·2019-08-28 17:51
閱讀 1136·2019-08-26 10:59
閱讀 1964·2019-08-26 10:25
閱讀 3181·2019-08-23 18:22
閱讀 898·2019-08-23 16:58