日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

【struts2+hibernate+spring项目实战】java监听器实现权限控制系统和资源获取优化(ssh)

發(fā)布時(shí)間:2025/3/20 windows 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【struts2+hibernate+spring项目实战】java监听器实现权限控制系统和资源获取优化(ssh) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、權(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 AbstractInterceptor

2.獲取當(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)裝配模式

private ResEbi resEbi;//struts會(huì)自動(dòng)的裝配public void setResEbi(ResEbi resEbi) {this.resEbi = resEbi;}

獲取所有資源信息

檢測(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ú)法直接獲取

//在登錄成功的時(shí)候,查詢?cè)撚脩舻乃袡?quán)限 List<ResModel> resList = resEbi.getResByEm(loginEm.getUuid()); StringBuilder sbf = new StringBuilder(); for (ResModel rm : resList) {sbf.append(rm.getText());sbf.append(","); }

全部代碼

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)器

public class AllResLoadListener implements ServletContextListener

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。