建体彩网|中彩网双色球连号|
?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

興發娛樂官網手機版客戶端:SSH集成框架下真正實現Spring AOP攔截功能

?

問題的提出:

在Struts1框架下,有三種類型的Action節制器,分手是MappingDispatchAction、DispatchAction和Action,他們是依次承襲,終極履行的execute措施。但MappingDispatchAction、DispatchAction的子類中沒有execute措施,只有參數指定的詳細措施,而這些措施是被MappingDispatchAction、DispatchAction本類的execute措施調用履行,分外留意的是它是經由過程反射機制來做的(大年夜家可以看看DispatchAction類的源代碼),以是這些被反射調用的措施是不能被Spring AOP攔截的,是以也就無法使用切面編程實現權限節制了。

辦理措施:

巴巴運動網經由過程覆蓋DelegatingRequestProcessor節制器的processActionPerform措施,是一種抱負的辦理規劃,但嚴格來說并不是AOP切面編程措施。是以筆者僅從進修AOP切面編程的角度來提出本文章,對付實用性筆者逝世力保舉巴巴運動網的規劃。

本措施辦理思惟:

1.覆蓋execute措施,再仿照DispatchAction反射調用詳細的措施;

2.實現Spring AOP攔截點,開始攔截設置設置設備擺設擺設描述的范圍內的法度榜樣;

3.在切入點法度榜樣中再次實現反射機制,獲取履行措施上的權限設置設置設備擺設擺設信息;

4.根據權限信息抉擇放行照樣返回。

終極既可以攔截到execute措施,也可以獲得詳細措施中的權限評釋設置設置設備擺設擺設信息。以本BBS系統為例:

第一步:凡承襲于DispatchAction的類都覆蓋execute措施:

@Override

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) throws Exception {

return super.execute(mapping, form, request, r興發娛樂官網手機版客戶端esponse);

}

//要是這個action中有一個詳細的措施:

@Privilege(userType=PrivilegeType.Admin,message="需治理員權限!")

public ActionForward addUI(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) throws Exception {

CategoryForm categoryForm = (CategoryForm)form;

categoryForm.setTitle("新增分類");

return mapping.findForward("addUI");

}

第二步:做自己的權限設置設置設備擺設擺設:

看上面addUI措施上的評釋應該可以理解這些設置設置設備擺設擺設

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public @interface Privilege {

String message() default "您沒有權限履行該操作,請登錄后重試!";

PrivilegeType userType();

}

設置設置設備擺設擺設中有個字字段是羅列,源碼如下:

publ興發娛樂官網手機版客戶端ic enum PrivilegeType {

LoginUser{

public String getName(){

return "所有登任命戶";

}

public int getValue(){

return 1;

}

},

LoginUserSelf{

public String getName(){

return "登任命戶自己";

}

public int getValue(){

return 2;

}

},

Moderator{

public String getName(){

return "版主";

}

public int getValue(){

return 3;

}

},

Admin{

public String getName(){

return "治理員";

}

public int getValue(){

return 4;

}

};興發娛樂官網手機版客戶端

public abstract String getName();

public abstract int getValue();

}

第三步:實現AOP切入編程:

@Aspect

@Component()

public class PrivilegeAction {

//攔截com.zjh包下(含子包)所有類能返回ActionForward類型的措施

@Around("execution(org.apache.struts.action.ActionForward com.zjh..*.*(..))")

public Object validatePrivilege(ProceedingJoinPoint pjp) throws Throwable{

// 從攔截的措施中參數中獲得四個工具

ActionMapping mapping = (Acti興發娛樂官網手機版客戶端onMapping) pjp.getArgs()[0];

ActionForm form = (ActionForm) pjp.getArgs()[1];

HttpServletRequest request = (HttpServletRequest) pjp.getArgs()[2];

HttpServletResponse response = (HttpServletResponse) pjp.getArgs()[3];

//從攔截點處獲取它所處的類名,并顛末反射取得權限設置設置設備擺設擺設信息

Class dispatchAction = Class.forName(pjp.getSignature().getDeclaringTypeName()); Object obj = dispatchAction.newInstance(); String mappingParament = mapping.getParameter()==null ? "execute" : request.getParameter(mapping.getParameter()); Method method = obj.getClass().getDeclaredMethod(mappingParament,

ActionMapping.class,

ActionForm.class,

HttpServle興發娛樂官網手機版客戶端tRequest.class,

HttpServletResponse.class); Privilege privilege = method.getAnnotation(Privilege.class);

//假如措施上沒有設置設置設備擺設擺設權限信息,直接放行

if(privilege==null)

return (ActionForward)pjp.proceed();

//否則必須是登任命戶,進行第一關粗粒度攔截

User user = WebUtil.getUserInSession(request);

if(user==null){

request.setAttribute("message", privilege.message());

return mapping.findForward("message");

} //再根據用戶類型進行細粒度攔截

switch(privilege.userType().getValue()){

//當權限為PrivilegeType.LoginUserSelf(登任命戶自己,例如更新文章必須是自

//己的文章才有權限更新)時,須從數據庫里取得用戶工具再和session頂用

//戶匹配,這個沒有實現。

case 2:

if(!user.getUsername().equals("數據庫里取得某文章的用戶名")){

request.setAttribute("message", privilege.message());

return mapping.findForward("message");

}

break;

//版主權限攔截,這個沒有實現

case 3:

request.setAttribute("message", privilege.message());

return mapping.findForward("message");

//治理員權限,從application取得治理員用戶名,再匹配session登任命戶是否相等

case 4:

String admin = ((SystemProperty)request.getSession().getServletContext().getAttribute("config"))

.getAdminUsername();

if(!user.getUsername().equals(admin)){

request.setAttribute("message", privilege.message());

return mapping.findForward("message");

}

break;

}

//當上面沒有攔住,表示權限容許,放行

return (ActionForward)pjp.proceed();

}

}

以上細粒度攔截屬營業邏輯,不陰礙本文所述的AOP切面編程。筆者僅僅是為進修AOP,真正用在真實項目的權限攔截,規劃不太成熟。

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

建体彩网
北京pk105码5期全天不挂公式 南翔食品零食店赚钱吗 大赢家彩票网新11选5 7星彩 蓝球nba比分 全民麻将开挂软件 浙江20选5几个号码中奖 河北快3开奖结果图 英超联赛第3 传奇链赚钱合法吗