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