【struts2+hibernate+spring项目实战】java监听器实现权限控制系统和资源获取优化(ssh)
一、權(quán)限控制系統(tǒng)
權(quán)限控制系統(tǒng)即用戶登錄后,如果操作了不能訪問的操作,系統(tǒng)將其攔截。
權(quán)限控制系統(tǒng)設(shè)計需求:
- 系統(tǒng)功能并不是所有功能都需要被控制,例如登錄功能無需校驗
設(shè)計方案:資源中沒有出現(xiàn)的功能將不被過濾 - 系統(tǒng)功能中具有訪問控制權(quán)限的一定出現(xiàn)在資源定義數(shù)據(jù)中。
- 用戶每次訪問某個功能時,必須先進行校驗,使用攔截器或AOP完成此功能。
1.自定義權(quán)限校驗攔截器AuthInterceptor
public class AuthInterceptor extends AbstractInterceptor2.獲取當前被攔截的操作信息
String actionName = invocation.getProxy().getAction().getClass().getName(); String methodName = invocation.getProxy().getMethod(); String allName = actionName + "." + methodName;3.啟動服務器,測試是否攔截到操作信息
4.獲取所有的資源信息
首先注入ResourceEbi,使用struts2的自動裝配模式
獲取所有資源信息
檢測調(diào)用資源是否存在于全資源列表中
//由直接在攔截器里面進行資源查詢的時候,每次都需要查詢,這樣會使得程序的效率很低, //因此在這里使用監(jiān)聽器,在程序加載的時候就加載好,這樣后面就不會再進行查詢 String allRes = ServletActionContext.getServletContext().getAttribute("allRes").toString(); if(!allRes.contains(allName)){return invocation.invoke(); }5.根據(jù)用戶登陸數(shù)據(jù),獲取登錄人所具有的資源數(shù)據(jù),其中關(guān)聯(lián)關(guān)系靠角色維護,即員工->角色->資源
獲取登陸用戶的所有資源
注:session中的登陸用戶數(shù)據(jù)中如果未對關(guān)聯(lián)數(shù)據(jù)進行初始化無法直接獲取
全部代碼
public class AuthInterceptor extends AbstractInterceptor{private ResEbi resEbi;//struts會自動的裝配public void setResEbi(ResEbi resEbi) {this.resEbi = resEbi;}public String intercept(ActionInvocation invocation) throws Exception {String actionName = invocation.getProxy().getAction().getClass().getName();String methodName = invocation.getProxy().getMethod();String allName = actionName + "." + methodName;System.out.println(allName);//由直接在攔截器里面進行資源查詢的時候,每次都需要查詢,這樣會使得程序的效率很低,//因此在這里使用監(jiān)聽器,在程序加載的時候就加載好,這樣后面就不會再進行查詢String allRes = ServletActionContext.getServletContext().getAttribute("allRes").toString();if(!allRes.contains(allName)){return invocation.invoke();}EmpModel em = (EmpModel) ActionContext.getContext().getSession().get(EmpModel.EMP_LOGIN_USER_OBJECT_NAME); // System.out.println("-----==-----"); // System.out.println(em.getResAll()); // System.out.println("-----==-----");//在登錄的時候?qū)⒂脩舻臋?quán)限查詢出來提高程序的效率if(em.getResAll().contains(allName)){return invocation.invoke();}throw new AppException("對不起你沒有訪問權(quán)限!");} }二、全資源獲取優(yōu)化
系統(tǒng)中每個用戶的每個操作均需要依賴攔截器進行校驗,其中的功能如果性能過低將使整體系統(tǒng)性能下降。對其中的數(shù)據(jù)獲取進行優(yōu)化。
由于權(quán)限校驗時,每次需要判定調(diào)用資源是否存在于所有資源列表中,以此判定當前操作是否需要權(quán)限攔截,所以需要將該數(shù)據(jù)的獲取進行優(yōu)化。
將此類數(shù)據(jù)的共享范圍擴大至應用程序范圍,將該數(shù)據(jù)獲取后,放置在ServletContext范圍內(nèi)。
1.開發(fā)Web監(jiān)聽器
2.監(jiān)聽器初始化時,獲取全資源信息,并將其加載到ServletContext范圍內(nèi)。為后期判定方便,將數(shù)據(jù)初始化為字符串信息,方便查詢,減少集合迭代次數(shù)。
public void contextInitialized(ServletContextEvent event) {ServletContext sc = event.getServletContext();WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sc);ResEbi resEbi = (ResEbi) ctx.getBean("resEbi");List<ResModel> resList = resEbi.getAll();StringBuilder sbf = new StringBuilder();for(ResModel temp :resList){sbf.append(temp.getText());sbf.append(",");}//放入sc中sc.setAttribute("allRes", sbf.toString());}3.配置Web監(jiān)聽器
4.在權(quán)限攔截器中獲取資源,斷開原始獲取資源方式
String allRes = ServletActionContext.getServletContext().getAttribute("allRes").toString(); if(!allRes.contains(allName)){return invocation.invoke(); }三、總結(jié)
這里主要是通過java監(jiān)聽器來實現(xiàn)權(quán)限的控制和對資源的啟動的優(yōu)化。
如果想獲取更多源碼或者視頻教程,歡迎關(guān)注我的微信公眾號 好好學java,在公眾號里,回復:java基礎(chǔ)、html5、javaEE基礎(chǔ)、struts2、spring、redis、luncene、oracle等,將可獲得以上的優(yōu)質(zhì)視頻教程及源碼。
總結(jié)
以上是生活随笔為你收集整理的【struts2+hibernate+spring项目实战】java监听器实现权限控制系统和资源获取优化(ssh)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java、前端、php、asp.net开
- 下一篇: 【struts2+hibernate+s