1、培訓(xùn)過(guò)程中,如有部分內(nèi)容理解不透或消化不好,可免費(fèi)在以后培訓(xùn)班中重聽(tīng); 2、培訓(xùn)結(jié)束后,授課老師留給學(xué)員聯(lián)系方式,保障培訓(xùn)效果,免費(fèi)提供課后技術(shù)支持。 3、培訓(xùn)合格學(xué)員可享受免費(fèi)推薦就業(yè)機(jī)會(huì)。
【前情提要】:
【Struts】
? ? ? ?Struts2是一個(gè)基于MVC設(shè)計(jì)模式的Web應(yīng)用框架,它本質(zhì)上相當(dāng)于一個(gè)servlet,在MVC設(shè)計(jì)模式中,Struts2作為控制器(Controller)來(lái)建立模型與視圖的數(shù)據(jù)交互。Struts 2是Struts的下一代產(chǎn)品,是在 struts 1和WebWork的技術(shù)基礎(chǔ)上進(jìn)行了合并的全新的Struts 2框架。其全新的Struts 2的與Struts 1的體系結(jié)構(gòu)差別巨大。Struts 2以WebWork為核心,采用攔截器的機(jī)制來(lái)處理用戶(hù)的請(qǐng)求,這樣的設(shè)計(jì)也使得業(yè)務(wù)邏輯控制器能夠與API完全脫離開(kāi),所以Struts 2可以理解為WebWork的更新產(chǎn)品。雖然從Struts 1到Struts 2有著太大的變化,但是相對(duì)于WebWork,Struts 2的變化很小。
? ? ? ? ? ? ?
【曝出高危安全漏洞】:
? ? ? Struts2曝出2個(gè)高危安全漏洞,一個(gè)是使用縮寫(xiě)的導(dǎo)航參數(shù)前綴時(shí)的遠(yuǎn)程代碼執(zhí)行漏洞,另一個(gè)是使用縮寫(xiě)的重定向參數(shù)前綴時(shí)的開(kāi)放式重定向漏洞。這些漏洞可使黑客取得網(wǎng)站服務(wù)器的“最高權(quán)限”,從而使企業(yè)服務(wù)器變成黑客手中的“肉雞”。
【解決措施】:
? ? ? Apache Struts團(tuán)隊(duì)已發(fā)布了最新的Struts 2.3.15.1,修復(fù)了上述漏洞,建議采用Struts 2.0至Struts 2.3的網(wǎng)站開(kāi)發(fā)者盡快升級(jí)至最新版。?
【帶來(lái)影響】:
? ? ? 據(jù)烏云平臺(tái)漏洞報(bào)告,淘寶、京東、騰訊等大型互聯(lián)網(wǎng)廠(chǎng)商均受此影響,而且漏洞利用代碼已經(jīng)被強(qiáng)化,可直接通過(guò)瀏覽器的提交對(duì)服務(wù)器進(jìn)行任意操作并獲取敏感內(nèi)容。Struts漏洞影響巨大,受影響站點(diǎn)以電商、銀行、門(mén)戶(hù)、政府居多,而且一些自動(dòng)化、傻瓜化的利用工具開(kāi)始出現(xiàn),填入地址可直接執(zhí)行服務(wù)器命令,讀取數(shù)據(jù)甚至直接關(guān)機(jī)等操作。[1]?
瑞星安全專(zhuān)家介紹,本次曝出的2個(gè)漏洞是由于縮寫(xiě)的導(dǎo)航和重定向前綴“action:”、 “redirect:”、 “redirectAction:”造成的。瑞星安全專(zhuān)家表示,由于這些參數(shù)前綴的內(nèi)容沒(méi)有被正確過(guò)濾,導(dǎo)致黑客可以通過(guò)漏洞執(zhí)行命令,獲取目標(biāo)服務(wù)器的信息,并進(jìn)一步取得服務(wù)器最高控制權(quán)。屆時(shí),被攻擊網(wǎng)站的數(shù)據(jù)庫(kù)將面臨全面泄密的威脅,同時(shí)黑客還可以通過(guò)重定向漏洞的手段,對(duì)其他網(wǎng)民進(jìn)行釣魚(yú)攻擊或掛馬攻擊。?
?
【Spring4】
? ? ?Spring是一個(gè)開(kāi)源框架, Spring使用基本的JavaBean來(lái)完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限于服務(wù)器端的開(kāi)發(fā)。從簡(jiǎn)單性、可測(cè)試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。
????目的:解決企業(yè)應(yīng)用開(kāi)發(fā)的復(fù)雜性
????功能:使用基本的JavaBean代替EJB,并提供了更多的企業(yè)應(yīng)用功能
????范圍:任何Java應(yīng)用
????簡(jiǎn)單來(lái)說(shuō),Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。
輕量——從大小與開(kāi)銷(xiāo)兩方面而言Spring都是輕量的。完整的Spring框架可以在一個(gè)大小只有1MB多的JAR文件里發(fā)布。并且Spring所需的處理開(kāi)銷(xiāo)也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應(yīng)用中的對(duì)象不依賴(lài)于Spring的特定類(lèi)。
控制反轉(zhuǎn)——Spring通過(guò)一種稱(chēng)作控制反轉(zhuǎn)(IoC)的技術(shù)促進(jìn)了松耦合。當(dāng)應(yīng)用了IoC,一個(gè)對(duì)象依賴(lài)的其它對(duì)象會(huì)通過(guò)被動(dòng)的方式傳遞進(jìn)來(lái),而不是這個(gè)對(duì)象自己創(chuàng)建或者查找依賴(lài)對(duì)象。你可以認(rèn)為IoC與JNDI相反——不是對(duì)象從容器中查找依賴(lài),而是容器在對(duì)象初始化時(shí)不等對(duì)象請(qǐng)求就主動(dòng)將依賴(lài)傳遞給它。
????面向切面——Spring提供了面向切面編程的豐富支持,允許通過(guò)分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級(jí)服務(wù)(例如審計(jì)(auditing)和事務(wù)(transaction)管理)進(jìn)行內(nèi)聚性的開(kāi)發(fā)。應(yīng)用對(duì)象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已。它們并不負(fù)責(zé)(甚至是意識(shí))其它的系統(tǒng)級(jí)關(guān)注點(diǎn),例如日志或事務(wù)支持。
容器——Spring包含并管理應(yīng)用對(duì)象的配置和生命周期,在這個(gè)意義上它是一種容器,你可以配置你的每個(gè)bean如何被創(chuàng)建——基于一個(gè)可配置原型(prototype),你的bean可以創(chuàng)建一個(gè)單獨(dú)的實(shí)例或者每次需要時(shí)都生成一個(gè)新的實(shí)例——以及它們是如何相互關(guān)聯(lián)的。然而,Spring不應(yīng)該被混同于傳統(tǒng)的重量級(jí)的EJB容器,它們經(jīng)常是龐大與笨重的,難以使用。
框架——Spring可以將簡(jiǎn)單的組件配置、組合成為復(fù)雜的應(yīng)用。在Spring中,應(yīng)用對(duì)象被聲明式地組合,典型地是在一個(gè)XML文件里。Spring也提供了很多基礎(chǔ)功能(事務(wù)管理、持久化框架集成等等),將應(yīng)用邏輯的開(kāi)發(fā)留給了你。
????所有Spring的這些特征使你能夠編寫(xiě)更干凈、更可管理、并且更易于測(cè)試的代碼。它們也為Spring中的各種模塊提供了基礎(chǔ)支持。
【Hibernate5?】
? ? ? Hibernate是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。 Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合,既可以在Java的客戶(hù)端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在應(yīng)用EJB的J2EE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任。
? ? ? Hibernate的核心接口一共有5個(gè),分別為:Session、SessionFactory、Transaction、Query和Configuration。這5個(gè)核心接口在任何開(kāi)發(fā)中都會(huì)用到。通過(guò)這些接口,不僅可以對(duì)持久化對(duì)象進(jìn)行存取,還能夠進(jìn)行事務(wù)控制。下面對(duì)這五個(gè)核心接口分別加以介紹。
? ? ? Session接口:Session接口負(fù)責(zé)執(zhí)行被持久化對(duì)象的CRUD操作(CRUD的任務(wù)是完成與數(shù)據(jù)庫(kù)的交流,包含了很多常見(jiàn)的SQL語(yǔ)句。)。但需要注意的是Session對(duì)象是非線(xiàn)程安全的。同時(shí),Hibernate的session不同于JSP應(yīng)用中的HttpSession。這里當(dāng)使用session這個(gè)術(shù)語(yǔ)時(shí),其實(shí)指的是Hibernate中的session,而以后會(huì)將HttpSesion對(duì)象稱(chēng)為用戶(hù)session。
? ? ? SessionFactory接口:SessionFactory接口負(fù)責(zé)初始化Hibernate。它充當(dāng)數(shù)據(jù)存儲(chǔ)源的代理,并負(fù)責(zé)創(chuàng)建Session對(duì)象。這里用到了工廠(chǎng)模式。需要注意的是SessionFactory并不是輕量級(jí)的,因?yàn)橐话闱闆r下,一個(gè)項(xiàng)目通常只需要一個(gè)SessionFactory就夠,當(dāng)需要操作多個(gè)數(shù)據(jù)庫(kù)時(shí),可以為每個(gè)數(shù)據(jù)庫(kù)指定一個(gè)SessionFactory。
? ? ? Configuration接口:Configuration接口負(fù)責(zé)配置并啟動(dòng)Hibernate,創(chuàng)建SessionFactory對(duì)象。在Hibernate的啟動(dòng)的過(guò)程中,Configuration類(lèi)的實(shí)例首先定位映射文檔位置、讀取配置,然后創(chuàng)建SessionFactory對(duì)象。
? ? ? Transaction接口:Transaction接口負(fù)責(zé)事務(wù)相關(guān)的操作。它是可選的,開(kāi)發(fā)人員也可以設(shè)計(jì)編寫(xiě)自己的底層事務(wù)處理代碼。
【在Struts + Spring + Hibernate的組合框架模式中,三者各自的特點(diǎn)都是什么?】
? ? ? Struts 的MVC設(shè)計(jì)模式可以使我們的邏輯變得很清晰。
? ? ? Spring 的IOC和AOP可以使我們的產(chǎn)品在最大限度上解藕。
? ? ? hibernate的當(dāng)然就是實(shí)體對(duì)象的持久化了
【三層結(jié)構(gòu)】
? ? ? 典型的J2EE三層結(jié)構(gòu),分為表現(xiàn)層、中間層(業(yè)務(wù)邏輯層)和數(shù)據(jù)服務(wù)層。三層體系將業(yè)務(wù)規(guī)則、數(shù)據(jù)訪(fǎng)問(wèn)及合法性校驗(yàn)等工作放在中間層處理。客戶(hù)端不直接與數(shù)據(jù)庫(kù)交互,而是通過(guò)組件與中間層建立連接,再由中間層與數(shù)據(jù)庫(kù)交互。
表現(xiàn)層是傳統(tǒng)的JSP技術(shù),自1999年問(wèn)世以來(lái),經(jīng)過(guò)多年的發(fā)展,其廣泛的應(yīng)用和穩(wěn)定的表現(xiàn),為其作為表現(xiàn)層技術(shù)打下了堅(jiān)實(shí)的基礎(chǔ)。
中間層采用的是流行的Spring+Hibernate,為了將控制層與業(yè)務(wù)邏輯層分離,又細(xì)分為以下幾種。
Web層,就是MVC模式里面的“C”(controller),負(fù)責(zé)控制業(yè)務(wù)邏輯層與表現(xiàn)層的交互,調(diào)用業(yè)務(wù)邏輯層,并將業(yè)務(wù)數(shù)據(jù)返回給表現(xiàn)層作組織表現(xiàn),該系統(tǒng)的MVC框架采用Struts。
Service層(就是業(yè)務(wù)邏輯層),負(fù)責(zé)實(shí)現(xiàn)業(yè)務(wù)邏輯。業(yè)務(wù)邏輯層以DAO層為基礎(chǔ),通過(guò)對(duì)DAO組件的正面模式包裝,完成系統(tǒng)所要求的業(yè)務(wù)邏輯。
? ? ?DAO層,負(fù)責(zé)與持久化對(duì)象交互。該層封裝了數(shù)據(jù)的增、刪、查、改的操作。
PO,持久化對(duì)象。通過(guò)實(shí)體關(guān)系映射工具將關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)映射成對(duì)象,很方便地實(shí)現(xiàn)以面向?qū)ο蠓绞讲僮鲾?shù)據(jù)庫(kù),該系統(tǒng)采用Hibernate作為ORM框架。
Spring的作用貫穿了整個(gè)中間層,將Web層、Service層、DAO層及PO無(wú)縫整合,其數(shù)據(jù)服務(wù)層用來(lái)存放數(shù)據(jù)。
一個(gè)良好的框架可以讓開(kāi)發(fā)人員減輕重新建立解決復(fù)雜問(wèn)題方案的負(fù)擔(dān)和精力;它可以被擴(kuò)展以進(jìn)行內(nèi)部的定制化;并且有強(qiáng)大的用戶(hù)社區(qū)來(lái)支持它。框架通常能很好的解決一個(gè)問(wèn)題。然而,你的應(yīng)用是分層的,可能每一個(gè)層都需要各自的框架。僅僅解決UI問(wèn)題并不意味著你能夠很好的將業(yè)務(wù)邏輯和持久性邏輯和UI 組件很好的耦合。
? ? ? 采用Hibernate作為持久層技術(shù)的最大的好處在于:可以完全以面向?qū)ο蟮姆绞竭M(jìn)行系統(tǒng)分析、系統(tǒng)設(shè)計(jì)。
DAO模式需要為每個(gè)DAO組件編寫(xiě)DAO接口,同時(shí)至少提供一個(gè)實(shí)現(xiàn)類(lèi),根據(jù)不同需要,可能有多個(gè)實(shí)現(xiàn)類(lèi)。用Spring容器代替DAO工廠(chǎng)
通常情況下,引入接口就不可避免需要引入工廠(chǎng)來(lái)負(fù)責(zé)DAO組件的生成。Spring實(shí)現(xiàn)了兩種基本模式:?jiǎn)螒B(tài)模式和工廠(chǎng)模式。而使用Spring可以完全避免使用工廠(chǎng)模式,因?yàn)镾pring就是個(gè)功能非常強(qiáng)大的工廠(chǎng)。因此,完全可以讓Spring充當(dāng)DAO工廠(chǎng)。
由Spring充當(dāng)DAO工廠(chǎng)時(shí),無(wú)須程序員自己實(shí)現(xiàn)工廠(chǎng)模式,只需要將DAO組件配置在Spring容器中,由ApplicationContext負(fù)責(zé)管理DAO組件的創(chuàng)建即可。借助于Spring提供的依賴(lài)注入,其他組件甚至不用訪(fǎng)問(wèn)工廠(chǎng),一樣可以直接使用DAO實(shí)例。