一、权限控制系统

权限控制系统即用户登录后,如果操作了不能访问的操作,系统将其拦截。
权限控制系统设计需求:

  • 系统功能并不是所有功能都需要被控制,例如登录功能无需校验
    设计方案:资源中没有出现的功能将不被过滤
  • 系统功能中具有访问控制权限的一定出现在资源定义数据中。
  • 用户每次访问某个功能时,必须先进行校验,使用拦截器或AOP完成此功能。

1.自定义权限校验拦截器AuthInterceptor

public class AuthInterceptor extends AbstractInterceptor

2.获取当前被拦截的操作信息

String actionName = invocation.getProxy().getAction().getClass().getName();
String methodName = invocation.getProxy().getMethod();
String allName = actionName + "." + methodName;

3.启动服务器,测试是否拦截到操作信息

4.获取所有的资源信息
首先注入ResourceEbi,使用struts2的自动装配模式

    private ResEbi resEbi;//struts会自动的装配public void setResEbi(ResEbi resEbi) {this.resEbi = resEbi;}

获取所有资源信息

检测调用资源是否存在于全资源列表中

//由直接在拦截器里面进行资源查询的时候,每次都需要查询,这样会使得程序的效率很低,
//因此在这里使用监听器,在程序加载的时候就加载好,这样后面就不会再进行查询
String allRes = ServletActionContext.getServletContext().getAttribute("allRes").toString();
if(!allRes.contains(allName)){return invocation.invoke();
}

5.根据用户登陆数据,获取登录人所具有的资源数据,其中关联关系靠角色维护,即员工->角色->资源
获取登陆用户的所有资源
注:session中的登陆用户数据中如果未对关联数据进行初始化无法直接获取

//在登录成功的时候,查询该用户的所有权限
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会自动的装配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);//由直接在拦截器里面进行资源查询的时候,每次都需要查询,这样会使得程序的效率很低,//因此在这里使用监听器,在程序加载的时候就加载好,这样后面就不会再进行查询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("-----==-----");//在登录的时候将用户的权限查询出来提高程序的效率if(em.getResAll().contains(allName)){return invocation.invoke();}throw new AppException("对不起你没有访问权限!");}
}

二、全资源获取优化

系统中每个用户的每个操作均需要依赖拦截器进行校验,其中的功能如果性能过低将使整体系统性能下降。对其中的数据获取进行优化。
由于权限校验时,每次需要判定调用资源是否存在于所有资源列表中,以此判定当前操作是否需要权限拦截,所以需要将该数据的获取进行优化。
将此类数据的共享范围扩大至应用程序范围,将该数据获取后,放置在ServletContext范围内。
1.开发Web监听器

public class AllResLoadListener implements ServletContextListener

2.监听器初始化时,获取全资源信息,并将其加载到ServletContext范围内。为后期判定方便,将数据初始化为字符串信息,方便查询,减少集合迭代次数。

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监听器

4.在权限拦截器中获取资源,断开原始获取资源方式

String allRes = ServletActionContext.getServletContext().getAttribute("allRes").toString();
if(!allRes.contains(allName)){return invocation.invoke();
}

三、总结

这里主要是通过java监听器来实现权限的控制和对资源的启动的优化。

如果想获取更多源码或者视频教程,欢迎关注我的微信公众号 好好学java,在公众号里,回复:java基础、html5、javaEE基础、struts2、spring、redis、luncene、oracle等,将可获得以上的优质视频教程及源码。

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

  1. 【struts2+hibernate+spring项目实战】实现用户登录功能(ssh)

    一.概述 从今天才开始有时间来总结总结以前自己练习的一些东西,希望总结出来对以后可以更加便捷的来学习,也希望可以帮助到正需要这些东西的同行人,一起学习,共同进步. 二. 登录功能总结 2.1.登录功能 ...

  2. 【struts2+hibernate+spring项目实战】数据报表jxl及生成excel(ssh项目实战)

    一.数据报表jxl jxl是一款java读写office--Excel文件的工具.通过java程序进行Excel文件的读写操作. 操作Excel首先应该明确操作过程中java针对Excel文件的对象分 ...

  3. 【struts2+hibernate+spring项目实战】统一异常处理(ssh)

    一.概述 在项目中总会出现各种异常.bug,为了使得用户体验更好,当系统出现异常的时候,我们需要有我们的处理方式,使得用户能够理解系统出现了什么问题. 二.异常类 首先我们需要编写一个异常类 pack ...

  4. 【struts2+hibernate+spring项目实战】Spring计时器任务 Spring整合JavaMail(邮件发送)(ssh)

    一.常用数据频度维护 对于系统使用度较高的数据,客户在查看时希望这些数据最好先出现,此时需要为其添加排序规则.在进行排序时,使用次数成为排序的依据.因此需要设置一个字段用来描述某种数据的使用次数,也就 ...

  5. 【struts2+hibernate+spring项目实战】java读写实现代码生成器(ssh)

    一.概述 开发阶段80%以上的模块都具有基本增删改查功能,反反复复的制作不仅效率低下,而且容易出错,使用代码生成器自动生成代码,只需要精品的开发出代码生成器,后期代码开发效率将直线上升. 代码生成器的 ...

  6. 【struts2+hibernate+spring项目实战】分页功能的完整的实现(通用分页、基类实现)

    一.概述 今天自己做了个项目练练,然后有一些分页的功能,自己把分页的功能做了一个简单的总结,然后,为了以后能够方便自己的开发,做了一个baseDao的实现. 二.代码实现 2.1.分页的实体类page ...

  7. 【struts2+hibernate+spring项目实战】Jfreechart工具使用(ssh项目实战)

    一.图形报表jfreechart 将解压的资源包拷贝出来,放置到无中文的目录中,使用下列指令运行 java -jar jfreechart-1.0.13-demo.jar 注意:不能只拷贝该文件,必须 ...

  8. 【struts2+hibernate+spring项目实战】用户登录校验(struts拦截器)

    一.概述 项目中所有页面均放入WEB-INF,所有页面安全性得到了很大程度的提高.但是当用户登录后长时间没有操作时,会造成Session数据的过期,如果此时获取Session中的数据,必定会引发WEB ...

  9. 【struts2+hibernate+spring项目实战】ajax+jquery报表数据显示(ssh)

    报表页数据显示 本项目中以商品采购信息为例,统计采购指定时间,指定供应商对应的采购报表信息,并以数据加图片的形式展示. 2.基于页面结构,设置采购链接对应的显示信息页面 当前仅制作根据商品名进行报表统 ...

最新文章

  1. 【亲测可用→防止入坑Routes】设置angular10项目异步加载、惰性加载、懒加载路由
  2. 清华“法律数据科研平台”向校内师生开放试运行
  3. Light OJ 1214 Large Division (大数取模)
  4. 阿里巴巴云原生应用安全防护实践与 OpenKruise 的新领域
  5. linux 内核连接跟踪,Linux内核连接跟踪锁的优化分析(1)
  6. puppet kick 功能实现
  7. angular ngoninit 刷新html页面_web前端入门到实战:实现html页面自动刷新
  8. java学习(155):序列化
  9. PHP 处理TXT文件(打开/关闭/检查/读取)
  10. Wishart分布及Inverse Wishart分布
  11. C#_根据银行卡卡号判断银行名称
  12. utc时间 单位换算_UTC时间和GMT时间 | 圈里圈外
  13. 华为Routing Switching切换为Datacom,究竟变了些什么
  14. 微信小程序图片加载失败渲染层网络层错误
  15. 黑马程序员---java基础-Java之IO
  16. 家有妙招:教你一个在淘宝买东西打折的好方法
  17. KMeans算法的K值以及初始类簇中心点的选取
  18. 深度学习之灾难性遗忘问题
  19. 寒假每日一题——两句话中的不常见单词
  20. 基于ESP8266+433射频控制系统

热门文章

  1. (数据挖掘 —— 无监督学习(聚类)
  2. (chap2 简单的Http协议) HTTP性能优化之持久连接Keep Alive
  3. Java中的static———静态变量
  4. 如何写一篇酷炫的博文(博文列表中展现字幕)
  5. [ARM-assembly]-全局变量/静态全局变量/初始化/未初始化变量的存放位置分析
  6. ICS汇编学习笔记——8086中的寄存器
  7. Dockerfile 部署Djano项目
  8. 查看java返回的值,JavaScript 遍历对象查找指定的值并返回路径
  9. 使用 rsync / scp 命令下载linux文件,显示网速和进度
  10. (70)内核重载 xp sp3 x86 单核