摘 要 Struts2框架改善了Struts框架的弊端,使得Web應(yīng)用開(kāi)發(fā)的過(guò)程更加簡(jiǎn)化。本文比較了在Struts框架和Struts2框架中實(shí)現(xiàn)權(quán)限控制的方法,分析了各自的適用環(huán)境以及優(yōu)缺點(diǎn)。
關(guān)鍵詞 Struts 權(quán)限控制 攔截器 容器
1、 引言
隨著Web的發(fā)展,Struts作為得到廣泛的應(yīng)用的Web框架顯露出越來(lái)越多的弊端,這就促使了Struts2的誕生。Struts2是一種全新的MVC框架技術(shù),Struts2是建立在Struts框架與WebWork框架基礎(chǔ)上的。雖然被稱(chēng)為Struts2框架,但是它與Struts卻有著不同的體系結(jié)構(gòu)。
在下文中,將對(duì)Struts2和Struts1.x這兩種框架實(shí)現(xiàn)權(quán)限控制的方法進(jìn)行詳細(xì)的比較。
2、Struts2技術(shù)
Struts 2 也是一個(gè)基于MVC模式的框架。框架中作為控制器的是 FilterDispatcher,它是一個(gè)Servlet過(guò)濾器。當(dāng)請(qǐng)求來(lái)到的時(shí)候,首先要經(jīng)過(guò)FilterDispatcher過(guò)濾,由它來(lái)決定由哪個(gè)bbbbbb來(lái)處理請(qǐng)求。而bbbbbb在Struts 2中是作為模型存在的。視圖方面除了JSP頁(yè)面外,Struts 2還可以使用Velocity、FreeMarker、Tiles等多種視圖資源。通過(guò)工作流程可以看出Interceptor(攔截器)在Struts2中具有重要的作用。攔截器可以用于在某個(gè)方法或字段被訪問(wèn)之前,進(jìn)行攔截然后在之前或之后加入某些操作。而這就為實(shí)現(xiàn)權(quán)限控制提供了條件。
3、 權(quán)限控制
3.1基于容器的權(quán)限控制
Tomcat是Web開(kāi)發(fā)中常用的容器, Struts框架和Struts2框架都可以利用Tomcat容器來(lái)實(shí)現(xiàn)權(quán)限控制而且相對(duì)比較簡(jiǎn)單。例如:一個(gè)工資管理系統(tǒng),每個(gè)員工都可以查看自己的收入情況,但是不能查看其他人的收入情況;部門(mén)管理人員可以查看所有員工收入情況;財(cái)務(wù)人員可以對(duì)收入進(jìn)行修改。
通過(guò)配置tomcat-users.xml文件,可以很簡(jiǎn)單的對(duì)角色進(jìn)行區(qū)分。配置片段如下:
<tomcat-users>
<role rolename=”emplee”/>
<user username=”test” password=”password” roles=”emplee”/>
<role rolename=”manager”/>
<user username=”manag” password=”password” roles=”manager”/>
</tomcat-users>
然后把角色添加到struts-config.xml文件中的bbbbbb標(biāo)簽上的roles屬性中去。該roles屬性表示哪些角色被授權(quán)訪問(wèn)該動(dòng)作映射。省略該roles屬性表示非保護(hù)狀態(tài)。代碼如下:
<bbbbbb-mappings>
<bbbbbb path=”/protected”
roles=”manager”
type=”org.apache.struts.bbbbbbs.Forwardbbbbbb”
bbbbbeter=”/WEB-INF/protectbbbp”/>
<bbbbbb path=”/unprotected”
type=”org.apache.struts.bbbbbbs.Forwardbbbbbb”
bbbbbeter=”/WEB-INF/unprotectbbbp”/>
</bbbbbb-mappings>
通過(guò)這樣簡(jiǎn)單的配置,登陸用戶在訪問(wèn)系統(tǒng)功能的時(shí)候就會(huì)被區(qū)別對(duì)待,不需要代碼進(jìn)行區(qū)分,而且tomcat-users.xml中的信息也可以由數(shù)據(jù)庫(kù)導(dǎo)入。
3.2 Struts中實(shí)現(xiàn)權(quán)限控制的方法
多數(shù)Web應(yīng)用都要求用戶登陸,才可以查看系統(tǒng)中某些資源;否則,系統(tǒng)會(huì)直接轉(zhuǎn)入登陸頁(yè)面。對(duì)于這種需求,可以在每個(gè)bbbbbb執(zhí)行實(shí)際處理邏輯之前,先執(zhí)行權(quán)限檢查邏輯。但這種做法不利于代碼復(fù)用,因?yàn)榇蟛糠謆bbbbb里的權(quán)限檢查代碼都大同小異。這時(shí)可以考慮利用公共的bbbbbb 實(shí)現(xiàn)用戶合法性的校驗(yàn)。
通過(guò)實(shí)現(xiàn)一個(gè)公共的bbbbbb 并加入相應(yīng)權(quán)限校驗(yàn)功能,所有需要執(zhí)行權(quán)限校驗(yàn)的bbbbbb 都可以繼承自此bbbbbb,例如:
public abstract class Verifybbbbbb extends bbbbbb{
public final bbbbbbForward execute(bbbbbbMapping mapping,bbbbbbbbbb bbbb,
HttpServletRequest request,HttpServletResponse response) throws Exception{
HttpSession session=request.getSession();
//如果沒(méi)有登陸,則返回重新登陸
bbbbbb user=session.getAttribute("user");
if (user==null) return (mapping.findForward("logon"));
}
}
當(dāng)需要進(jìn)行權(quán)限校驗(yàn)的bbbbbb 可以繼承以上的bbbbbb,而無(wú)須權(quán)限校驗(yàn)的bbbbbb 則可以繼承自Struts 本身所提供的bbbbbb。繼承的方式可以在一定程度上減少代碼量,代碼的可維護(hù)性也得到提高,但是靈活性較差。當(dāng)需要更新驗(yàn)證方式的時(shí)候,還需要改動(dòng)很大代碼。
3.3 Struts2中實(shí)現(xiàn)權(quán)限控制的方法
采用攔截器就不存在Struts中繼承方式的弊端。Struts2攔截器的實(shí)現(xiàn)原理相對(duì)簡(jiǎn)單,當(dāng)請(qǐng)求struts2的bbbbbb時(shí),Struts 2會(huì)查找配置文件,并根據(jù)其配置實(shí)例化相對(duì)的攔截器對(duì)象,然后串成一個(gè)列表,最后一個(gè)一個(gè)地調(diào)用列表中的攔截器,而且攔截器是以可插拔的方式來(lái)實(shí)現(xiàn)的,在攔截器列表中增加或減少一個(gè)攔截器不會(huì)影響到其他功能的實(shí)現(xiàn)。
權(quán)限檢查攔截器繼承自AbstractInterceptor類(lèi) ,攔截bbbbbb處理的攔截方法的代碼如下:
public bbbbbb intercept(bbbbbbInvocation invocation) throws Exception {
//取得請(qǐng)求相關(guān)的bbbbbbContext實(shí)例
bbbbbbContext ctx = invocation.getInvocationContext();
Map session = ctx.getSession();
//取出user的Session屬性
bbbbbb user = (bbbbbb)session.get("user");
//如果沒(méi)有登陸,則返回重新登陸
if (user != null ) {
return invocation.invoke();
}
return bbbbbb.LOGIN;
}
這段代碼,先通過(guò)bbbbbbInvocation參數(shù)取得用戶的Session實(shí)例的引用,然后從中取出user屬性,通過(guò)判斷該屬性值來(lái)確定用戶是否登陸系統(tǒng),從而判斷是否需要轉(zhuǎn)入登陸頁(yè)面。
一旦實(shí)現(xiàn)了權(quán)限檢查攔截器,就可以在所有需要實(shí)現(xiàn)權(quán)限控制的bbbbbb中復(fù)用上面的攔截器。 為了使用該攔截器,首先在struts.xml文件中定義該攔截器,定義攔截器的配置片段如下:
<interceptors>
<interceptor name="authority" class="test.wyt.AuthorityInterceptor"/>
</interceptors>
定義了該攔截器之后,就可以在bbbbbb中應(yīng)用該攔截器。這種通過(guò)攔截器進(jìn)行權(quán)限控制的方式,顯然具有更好的代碼復(fù)用。為了避免在每個(gè)bbbbbb中重復(fù)配置該攔截器,可以將該攔截器配置成一個(gè)默認(rèn)攔截器棧。一旦在某個(gè)包下定義了默認(rèn)的攔截器棧,在該包下的所有bbbbbb都會(huì)自動(dòng)增加權(quán)限檢查功能。
4、 結(jié)束語(yǔ)
Struts應(yīng)用框架,已經(jīng)廣泛地運(yùn)用于企業(yè)平臺(tái)中,而Struts2應(yīng)用框架在提高系統(tǒng)開(kāi)發(fā)效率,增加代碼復(fù)用效率,增強(qiáng)系統(tǒng)可維護(hù)性,縮短系統(tǒng)開(kāi)發(fā)時(shí)間這些方面更為優(yōu)秀。本文所提到的權(quán)限控制方法中,通過(guò)bbbbbb實(shí)現(xiàn)權(quán)限控制易于實(shí)現(xiàn)但不利于系統(tǒng)維護(hù)更新,基于容器的權(quán)限控制方法簡(jiǎn)單但不適合用戶變化頻繁的應(yīng)用系統(tǒng),而使用攔截器實(shí)










