资讯动态

【JavaWeb学习 | 第23篇】监听器、RBAC权限模型

发布时间:2026/9/9 22:20:44 来源:尧图企业网站定制
【JavaWeb学习 | 第23篇】监听器Listener与 RBAC 权限模型恭喜你坚持学到第23篇前面我们已经掌握了Filter过滤器、AJAXJSON、文件上传下载等实用技术。今天这篇将介绍两个重要内容Listener监听器基于事件驱动的组件能监听应用、会话、请求的生命周期。RBAC 权限模型企业级系统中最常用的权限控制思想常与 Filter 结合实现细粒度权限管理。两者结合后你就能搭建一个相对完整的“用户-角色-权限”后台管理系统框架。一、什么是 Listener监听器Listener是 Servlet 规范提供的事件监听机制基于观察者模式。它可以在特定事件发生时比如 Session 创建、应用启动等自动执行代码而无需手动调用。Listener不需要在请求中显式调用容器会自动触发。1. JavaWeb 中主要的 Listener 接口Listener 接口监听对象主要方法常见应用场景ServletContextListenerapplicationcontextInitialized / contextDestroyed应用启动时加载全局数据、初始化连接池HttpSessionListenersessionsessionCreated / sessionDestroyed在线人数统计、Session 超时处理ServletRequestListenerrequestrequestInitialized / requestDestroyed请求日志记录、统一处理HttpSessionAttributeListenersession 属性attributeAdded / attributeRemoved / attributeReplacedSession 属性变化监控ServletContextAttributeListenerapplication 属性attributeAdded / …全局属性变化监控ServletRequestAttributeListenerrequest 属性attributeAdded / …请求属性变化监控其中最常用的是前三个。2. Listener 的开发步骤步骤1编写监听器类实现对应接口。步骤2使用注解或 web.xml 配置推荐注解。示例1应用启动/销毁监听ServletContextListener// com.example.listener.AppListener.javaWebListenerpublicclassAppListenerimplementsServletContextListener{OverridepublicvoidcontextInitialized(ServletContextEventsce){// 应用启动时执行服务器启动或项目部署ServletContextcontextsce.getServletContext();System.out.println(【应用启动】context.getContextPath() 已启动);// 初始化全局数据例如加载字典、连接池等context.setAttribute(appName,我的JavaWeb系统);context.setAttribute(onlineCount,0);// 在线人数初始值}OverridepublicvoidcontextDestroyed(ServletContextEventsce){// 应用销毁时执行服务器关闭或项目卸载System.out.println(【应用销毁】系统正在关闭...);}}示例2在线人数统计HttpSessionListener—— 经典案例WebListenerpublicclassOnlineListenerimplementsHttpSessionListener{OverridepublicvoidsessionCreated(HttpSessionEventse){// 新用户打开浏览器Session 创建时ServletContextcontextse.getSession().getServletContext();Integercount(Integer)context.getAttribute(onlineCount);if(countnull)count0;count;context.setAttribute(onlineCount,count);System.out.println(【在线人数 1】 当前在线count);}OverridepublicvoidsessionDestroyed(HttpSessionEventse){// Session 超时或 invalidate() 时ServletContextcontextse.getSession().getServletContext();Integercount(Integer)context.getAttribute(onlineCount);if(count!nullcount0){count--;context.setAttribute(onlineCount,count);}System.out.println(【在线人数 -1】 当前在线count);}}前端显示在线人数任意 JSP 页面当前在线人数${applicationScope.onlineCount}注意同一个用户在多个标签页仍算1人因为共享同一个 Session。若要统计“并发 Session 数”可进一步记录用户 IP SessionId。二、RBAC 权限模型Role-Based Access ControlRBAC是目前企业系统中最主流的权限控制模型核心思想是权限不直接给用户而是给角色用户再关联角色。这样极大简化了权限管理用户数量多时特别明显。1. RBAC 核心概念RBAC0 基础模型用户User系统登录者角色Role权限的集合如 “管理员”、“普通用户”、“财务专员”权限Permission具体操作如 “用户列表查看”、“订单删除”关系用户 ↔ 多对多 ↔ 角色角色 ↔ 多对多 ↔ 权限经典数据库表结构5张表sys_user用户表sys_role角色表sys_permission权限/菜单/URL 表sys_user_role用户-角色中间表sys_role_permission角色-权限中间表扩展模型RBAC1角色继承管理员继承普通用户权限RBAC2角色约束互斥角色、基数约束等RBAC3RBAC1 RBAC22. JavaWeb 中 RBAC 的经典实现方式核心思路用户登录成功后在LoginServlet中查询该用户拥有的所有权限或 URL 列表存入Session。使用Filter权限过滤器拦截请求检查当前请求的 URL 是否在用户 Session 的权限列表中。如果没有权限 → 跳转到“无权限提示页”或返回 JSON 错误。示例权限过滤器结合之前学习的 FilterWebFilter(/*)publicclassPermissionFilterimplementsFilter{OverridepublicvoiddoFilter(ServletRequestreq,ServletResponseresp,FilterChainchain)throwsIOException,ServletException{HttpServletRequestrequest(HttpServletRequest)req;HttpServletResponseresponse(HttpServletResponse)resp;Stringurirequest.getRequestURI();// 1. 放行静态资源和登录相关if(uri.contains(/login)||uri.contains(/static/)||uri.endsWith(.css)||uri.endsWith(.js)||uri.endsWith(.png)){chain.doFilter(request,response);return;}// 2. 检查是否登录结合之前的 LoginFilterHttpSessionsessionrequest.getSession(false);if(sessionnull||session.getAttribute(user)null){request.setAttribute(errorMsg,请先登录);request.getRequestDispatcher(/login.jsp).forward(request,response);return;}// 3. RBAC 权限校验SuppressWarnings(unchecked)ListStringuserPermissions(ListString)session.getAttribute(userPermissions);// 假设权限存储为 URL 列表如 [/user/list, /order/add]booleanhasPermissionfalse;if(userPermissions!null){for(Stringperm:userPermissions){if(uri.contains(perm)){hasPermissiontrue;break;}}}if(hasPermission||isAdmin(session)){// 管理员特殊放行chain.doFilter(request,response);}else{// 无权限if(request.getHeader(X-Requested-With)!null){// AJAX 请求返回 JSONresponse.setContentType(application/json);response.getWriter().write({\code\:403,\msg\:\无权限访问\});}else{request.setAttribute(errorMsg,抱歉您没有权限访问该页面);request.getRequestDispatcher(/error/noPermission.jsp).forward(request,response);}}}privatebooleanisAdmin(HttpSessionsession){// 简单判断是否为管理员角色returnadmin.equals(session.getAttribute(userRole));}}登录时加载权限LoginServlet 片段// 登录成功后Useruser...;ListStringpermspermissionService.getUserPermissions(user.getId());// 查询数据库session.setAttribute(user,user);session.setAttribute(userPermissions,perms);session.setAttribute(userRole,user.getRoleCode());三、实际开发建议Listener适合做全局初始化和被动事件响应不要放复杂业务逻辑。在线人数统计建议结合HttpSessionBindingListener让 User 对象实现该接口销毁时自动减数更精确。RBAC在中小项目中常用URL 权限 Filter 实现大型项目推荐引入Spring Security或Shiro。菜单权限登录后把用户有权限的菜单也存入 Session前端用 JSTL/c:if 动态显示菜单。权限颗粒度可以细化到按钮级别用自定义标签或 JS 控制按钮显示。四、练习建议强烈推荐完成实现在线人数统计Listener application 作用域并在首页实时显示。实现Session 监听当用户注销session.invalidate()时自动减在线人数。搭建简易RBAC创建用户、角色、权限表可用 MySQL登录时加载权限到 Session编写 PermissionFilter 实现 URL 权限控制结合之前 Filter 系列做一个登录过滤器 权限过滤器链。进阶实现角色继承管理员自动拥有普通用户所有权限。完成这些你的 JavaWeb 项目已经具备了“用户管理 权限控制 在线监控”的基础骨架非常接近真实后台管理系统系列文章导航持续更新中第21篇AJAX与JSON详解第22篇文件上传下载与 Excel 导入导出第23篇监听器与 RBAC 权限模型本文第24篇综合案例—— 基于 Servlet JSP MVC Filter Listener RBAC 的简易后台管理系统推荐有任何疑问比如想看更完整的在线用户列表代码、RBAC 数据库表设计、或如何把权限细化到按钮级别欢迎在评论区留言我会尽快补充详细示例掌握了 Listener 和 RBAC你已经具备了独立开发中小型 JavaWeb 管理系统的能力。继续加油下一篇文章我们将把前面所有知识点整合起来做一个完整的小项目下一篇文章见

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价