struts2攔截器實(shí)現(xiàn)細(xì)顆粒度權(quán)限控制_第1頁(yè)
struts2攔截器實(shí)現(xiàn)細(xì)顆粒度權(quán)限控制_第2頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Struts2攔截器實(shí)現(xiàn)細(xì)顆粒權(quán)限控制1:在util包下創(chuàng)建注解的類AnnotationLimit,用來(lái)控制在Action類中的方法例如:在Action的方法上定義:AnnotationLimit(mid=an,pid=am)package cn.itcast.elec.util;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;/* * 自定義注解 */被這個(gè)注解修飾的注解,利用反射,將其他的注解讀取出來(lái)Retention(RetentionPolicy.RUNTIME)publ

2、ic interface AnnotationLimit String mid(); /子模塊模塊名稱String pid(); /父模塊操作名稱2:在util包下創(chuàng)建攔截器ErrorAndLimitInterceptor,代碼如下:package cn.itcast.elec.util;import java.lang.reflect.Method;import java.util.Hashtable;import java.util.Iterator;import java.util.List;import java.util.Map.Entry;import javax.servlet.

3、http.HttpServletRequest;import mons.logging.Log;import mons.logging.LogFactory;import org.apache.struts2.StrutsStatics;import org.springframework.web.context.WebApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils;import cn.itcast.elec.domain.ElecRolePopedom;i

4、mport cn.itcast.elec.domain.ElecUser;import cn.itcast.elec.service.IElecRoleService;import com.opensymphony.xwork2.ActionInvocation;import erceptor.MethodFilterInterceptor;SuppressWarnings(serial)public class ErrorAndLimitInterceptor extends MethodFilterInterceptor public void init() /* * 過(guò)濾器過(guò)濾url(.

5、do和.jsp) * 攔截器攔截url(.do) * actioninvocation.invoke():調(diào)用struts2的Action的方法,并返回String類型的對(duì)應(yīng)的返回值 */public String doIntercept(ActionInvocation actioninvocation) /把自定義錯(cuò)誤信息 放置到request中HttpServletRequest request = (HttpServletRequest) actioninvocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);tr

6、y /獲取請(qǐng)求的action對(duì)象Object action = actioninvocation.getAction();/獲取請(qǐng)求的方法的名稱String methodName = actioninvocation.getProxy().getMethod();/獲取action中的方法的封裝類(action中的方法沒(méi)有參數(shù))Method method = action.getClass().getMethod(methodName, null);String result = null; / Action的返回值 /在完成跳轉(zhuǎn)Action之前完成細(xì)顆粒權(quán)限控制,控制Action的每個(gè)方法/

7、檢查注解,是否可以操作權(quán)限的URLboolean flag = isCheckLimit(request,method);if(flag)/ 運(yùn)行被攔截的Action,期間如果發(fā)生異常會(huì)被catch住 result = actioninvocation.invoke();elserequest.setAttribute(errorMsg, 對(duì)不起!您沒(méi)有權(quán)限操作此功能!);return errorMsg;return result; catch (Exception e) /* * 處理異常 */String errorMsg = 出現(xiàn)錯(cuò)誤信息,請(qǐng)查看日志!;/通過(guò)instanceof判斷到底

8、是什么異常類型 if (e instanceof RuntimeException) /未知的運(yùn)行時(shí)異常 RuntimeException re = (RuntimeException) e;/re.printStackTrace();errorMsg = re.getMessage().trim();/* * 發(fā)送錯(cuò)誤消息到頁(yè)面 */request.setAttribute(errorMsg, errorMsg);/* * log4j記錄日志 */Log log = LogFactory.getLog(actioninvocation.getAction().getClass();log.e

9、rror(errorMsg, e);return errorMsg;/ .end of catch public void destroy() /*驗(yàn)證細(xì)顆粒權(quán)限控制*/public boolean isCheckLimit(HttpServletRequest request, Method method) if(method = null)return false;/獲取當(dāng)前的登陸用戶ElecUser elecUser = (ElecUser)request.getSession().getAttribute(globle_user);if(elecUser = null)return f

10、alse;/獲取當(dāng)前登陸用戶的角色(一個(gè)用戶可以對(duì)應(yīng)多個(gè)角色)Hashtable ht = (Hashtable)request.getSession().getAttribute(globle_role);if(ht = null)return false;/處理注解,判斷方法上是否存在注解(注解的名稱為:AnnotationLimit)/* * 例如: * AnnotationLimit(mid=aa,pid=0) public String home() */boolean isAnnotationPresent = method.isAnnotationPresent(Annotati

11、onLimit.class);/不存在注解(此時(shí)不能操作該方法)if(!isAnnotationPresent)return false;/存在注解(調(diào)用注解)AnnotationLimit limit = method.getAnnotation(AnnotationLimit.class);/獲取注解上的值String mid = limit.mid(); /權(quán)限子模塊名稱String pid = limit.pid(); /權(quán)限父操作名稱/* * 如果登陸用戶的角色id+注解上的AnnotationLimit(mid=aa,pid=0) * * 在elec_role_popedom表中存

12、在 flag=true,此時(shí)可以訪問(wèn)Action的方法; * * 在elec_role_popedom表中不存在 flag=false,此時(shí)不能訪問(wèn)Action的方法; */boolean flag = false;/攔截器中加載spring容器,從而獲取Service類,使用Service類查詢對(duì)應(yīng)的用戶信息WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext();IElecRoleService elecRo

13、leService = (IElecRoleService)wac.getBean(IElecRoleService.SERVICE_NAME);/遍歷角色I(xiàn)Dif(ht!=null & ht.size()0)for(IteratorEntry ite = ht.entrySet().iterator();ite.hasNext();)Entry entry = ite.next();/獲取角色I(xiàn)DString roleID = entry.getKey();flag = elecRoleService.findRolePopedomByID(roleID, mid, pid);if(flag

14、)break;return flag;3:在ElecRoleService類下創(chuàng)建新增方法,使用角色I(xiàn)D,權(quán)限code,父級(jí)權(quán)限code作為聯(lián)合主鍵查詢角色權(quán)限表,判斷當(dāng)前用戶是否可以訪問(wèn)該操作。 /*使用角色I(xiàn)D,子權(quán)限編號(hào),父權(quán)限編號(hào),查詢角色權(quán)限表的所有數(shù)據(jù)*/public boolean findRolePopedomByID(String roleID,String mid,String pid) /組織查詢條件String condition = ;List paramsList = new ArrayList();/角色I(xiàn)Dif(StringUtils.isNotBlank(ro

15、leID)condition += and o.roleID = ?;paramsList.add(roleID);/子權(quán)限名稱if(StringUtils.isNotBlank(mid)condition += and o.mid = ?;paramsList.add(mid);/父權(quán)限名稱if(StringUtils.isNotBlank(pid)condition += and o.pid = ?;paramsList.add(pid);Object params = paramsList.toArray();/查詢對(duì)應(yīng)的角色權(quán)限信息List list = elecRolePopedomDao.findCollectionByConditionNoPage(condition, params, null);boolean flag = false;if(list!=nul

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論