一、struts2簡(jiǎn)介
Struts2是一個(gè)基于MVC設(shè)計(jì)模式的Web應(yīng)用框架,它本質(zhì)上相當(dāng)于一個(gè)servlet,在MVC設(shè)計(jì)模式中,Struts2作為控制器(Controller)來(lái)建立模型與視圖的數(shù)據(jù)交互。也就是說(shuō),struts2可以實(shí)現(xiàn)代碼的MVC分離,而傳統(tǒng)的servlet在面對(duì)龐大的工程時(shí)解耦不是很好。在團(tuán)隊(duì)協(xié)作里面,struts2的配置文件是聯(lián)系不同模塊之間的關(guān)鍵,方便解耦。
不過(guò),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ù)器變成黑客手中的“肉雞”。所以有觀點(diǎn)認(rèn)為SpringMVC將逐步吞并struts2,不過(guò)本人沒(méi)有學(xué)習(xí)過(guò)SpringMVC,所以無(wú)法對(duì)以上觀點(diǎn)做出評(píng)判。
二、struts2攔截器介紹
攔截器是面向切面編程的實(shí)例,它將多個(gè)模塊的共同代碼模塊提取出來(lái),靈活地插入各個(gè)模塊之中,減少了系統(tǒng)的重復(fù)代碼,確保業(yè)務(wù)對(duì)象的整潔。
面向切面編程(AOP)舉例:一個(gè)工程當(dāng)中多個(gè)類需要在執(zhí)行之后打印日志信息,“打印日志信息”這一功能并不是某個(gè)特定模塊獨(dú)有的功能,如果在每個(gè)模塊都加入這部分代碼,就會(huì)導(dǎo)致代碼重用性降低,所以就有了面向切面編程編程,將打印日志信息這部分代碼提取出來(lái),靈活的嵌入各個(gè)模塊。
struts2攔截器體現(xiàn)了AOP思想,它可以在指定action的代碼執(zhí)行前后加入攔截器類的代碼,不需要的時(shí)候,只需要在配置文件中刪除攔截器,同時(shí)可以保留攔截器的代碼。
三、攔截器的使用例子
此處使用struts2攔截器實(shí)現(xiàn)登錄驗(yàn)證功能來(lái)介紹攔截器的使用。
功能描述:網(wǎng)站的某部分內(nèi)容在用戶沒(méi)登錄之前是不能訪問(wèn)的,最簡(jiǎn)單的做法就是在每個(gè)展現(xiàn)內(nèi)容的action中加入幾句判斷用戶是否登錄的代碼,但如果涉及的action比較多,開(kāi)發(fā)者就不得不復(fù)制粘貼同樣的代碼到不同的類中,而修改的時(shí)候也需要到各個(gè)類修改,比較麻煩。
struts2攔截器將代碼實(shí)現(xiàn)和AOP的配置分開(kāi)來(lái),配置信息集中在struts2.xml中,比較方便修改。此外代碼只有一份,可以做到一次修改,造福全局。
流程如下(登錄之后才能訪問(wèn)的網(wǎng)頁(yè)放在WEB-INF下):
登錄->action1->驗(yàn)證成功->跳轉(zhuǎn)到頁(yè)面1->點(diǎn)擊某個(gè)按鈕->調(diào)用action2->使用登錄后才能用的頁(yè)面2.
通常action1不用攔截器,因?yàn)楸旧硎堑卿涷?yàn)證部分,而action2則需要,所以需要在“”使用登錄后才能用的頁(yè)面2”前添加攔截器,變?yōu)椋?/p>
登錄->action1->驗(yàn)證成功->跳轉(zhuǎn)到頁(yè)面1->點(diǎn)擊某個(gè)按鈕->調(diào)用action2->攔截器驗(yàn)證當(dāng)前是否登錄->使用登錄后才能用的頁(yè)面2.
代碼:
1、配置web.xml,使用struts2

2、jsp頁(yè)面



3、編寫(xiě)對(duì)應(yīng)的action


4、編寫(xiě)攔截器

5、配置struts2.xml
