目录
- 1、监听器ServletContextListener
- 1.1、主要用途
- 1.2、接口方法
- 1.3、实现步骤
- 1.4、示例代码
- 1.5、使用场景
- 2、德鲁伊数据源
- 2.1、主要特性
- 2.2、配置 `DruidDataSource`
- 3、RBAC权限模型
- 3.1、什么是RBAC
- 3.2、RBAC 的核心概念
- 3.3、RBAC 的优势
- 3.4、RBAC 的实现步骤
1、监听器ServletContextListener
ServletContextListener
是 Java Servlet API 中的一个接口,用于监听 ServletContext
的生命周期事件。ServletContext
代表整个 Web 应用程序的上下文环境,ServletContextListener
允许你在 Web 应用程序启动和关闭时执行一些初始化或清理操作。
1.1、主要用途
- 初始化操作:在 Web 应用程序启动时执行一些初始化操作,例如加载配置文件、初始化数据库连接池、注册自定义的 Servlet 或 Filter 等。
- 清理操作:在 Web 应用程序关闭时执行一些清理操作,例如关闭数据库连接、释放资源等。
1.2、接口方法
ServletContextListener
接口定义了两个方法:
-
contextInitialized(ServletContextEvent sce)
:- 当 Web 应用程序启动时,Servlet 容器会调用此方法。
- 你可以在这个方法中执行一些初始化操作。
-
contextDestroyed(ServletContextEvent sce)
:- 当 Web 应用程序关闭时,Servlet 容器会调用此方法。
- 你可以在这个方法中执行一些清理操作。
1.3、实现步骤
-
创建一个实现
ServletContextListener
接口的类:- 你需要创建一个类并实现
ServletContextListener
接口,然后重写contextInitialized
和contextDestroyed
方法。
- 你需要创建一个类并实现
-
在
web.xml
中配置监听器:- 你需要在
web.xml
文件中配置这个监听器,以便 Servlet 容器能够识别并调用它。
- 你需要在
1.4、示例代码
1.实现 ServletContextListener
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;@WebListener // 使用注解配置监听器(适用于 Servlet 3.0 及以上版本)
public class MyServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// Web 应用程序启动时执行System.out.println("Web 应用程序启动,执行初始化操作...");// 例如:加载配置文件、初始化数据库连接池等}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// Web 应用程序关闭时执行System.out.println("Web 应用程序关闭,执行清理操作...");// 例如:关闭数据库连接、释放资源等}
}
2.在 web.xml
中配置监听器(适用于 Servlet 2.5 及以下版本)
如果你使用的是 Servlet 2.5 或更早的版本,或者你不想使用注解,可以在 web.xml
文件中配置监听器:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><listener><listener-class>com.example.MyServletContextListener</listener-class></listener></web-app>
1.5、使用场景
-
加载配置文件:
- 在
contextInitialized
方法中加载应用程序的配置文件,例如数据库连接信息、系统参数等。
- 在
-
初始化数据库连接池:
- 在
contextInitialized
方法中初始化数据库连接池,以便在应用程序运行时可以快速获取数据库连接。
- 在
-
注册自定义的 Servlet 或 Filter:
- 在
contextInitialized
方法中动态注册自定义的 Servlet 或 Filter。
- 在
-
释放资源:
- 在
contextDestroyed
方法中关闭数据库连接、释放线程池等资源。
- 在
2、德鲁伊数据源
DruidDataSource
是阿里巴巴开源的高性能连接池组件,广泛应用于 Java 应用程序中,特别是在与数据库进行交互时。可以利用Servlet上下文监听器建立工程中需要的数据源。
2.1、主要特性
- 高性能:Druid 在连接池管理和数据库访问方面进行了大量的优化,使得它在高并发场景下表现优异。
- 监控功能:Druid 提供了丰富的监控功能,可以通过 JMX、Web 监控页面等方式监控连接池的状态和 SQL 语句的执行情况。
- 日志功能:Druid 可以记录 SQL 语句的执行情况,帮助你定位和优化 SQL 语句。
- 配置灵活:Druid 提供了丰富的配置项,可以根据不同的应用场景进行灵活配置。
- 内置 SQL 防注入功能:Druid 可以自动检测并防止 SQL 注入攻击。
2.2、配置 DruidDataSource
1.Maven 依赖
首先,你需要在你的项目中添加 Druid 的 Maven 依赖:
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version> <!-- 请使用最新版本 -->
</dependency>
2.基本配置
你可以通过代码或配置文件来配置 DruidDataSource
。以下是通过代码配置的基本示例:
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;public class DruidDataSourceExample {public static void main(String[] args) {// 创建 DruidDataSource 实例DruidDataSource dataSource = new DruidDataSource();// 设置数据库连接的基本信息dataSource.setUrl("jdbc:mysql://localhost:3306/your_database");dataSource.setUsername("your_username");dataSource.setPassword("your_password");// 设置连接池的初始大小dataSource.setInitialSize(5);// 设置连接池的最大连接数dataSource.setMaxActive(20);// 设置连接池的最大等待时间dataSource.setMaxWait(60000);// 设置连接池的最小空闲连接数dataSource.setMinIdle(5);// 设置连接池的测试查询dataSource.setTestOnBorrow(true);dataSource.setValidationQuery("SELECT 1");// 获取连接try (Connection conn = dataSource.getConnection()) {System.out.println("数据库连接成功: " + conn);} catch (Exception e) {e.printStackTrace();}// 关闭数据源dataSource.close();}
}
3.配置文件
你也可以通过配置文件(如 druid.properties
)来配置 DruidDataSource
。例如:
# 数据库连接的基本信息
spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=your_username
spring.datasource.password=your_password# 连接池的初始大小
spring.datasource.druid.initial-size=5# 连接池的最大连接数
spring.datasource.druid.max-active=20# 连接池的最大等待时间
spring.datasource.druid.max-wait=60000# 连接池的最小空闲连接数
spring.datasource.druid.min-idle=5# 连接池的测试查询
spring.datasource.druid.test-on-borrow=true
spring.datasource.druid.validation-query=SELECT 1
3、RBAC权限模型
3.1、什么是RBAC
RBAC(Role-Based Access Control,基于角色的访问控制)是一种广泛应用于信息系统安全的权限管理模型。它的核心思想是通过角色来管理权限,从而简化权限管理的过程。RBAC 将权限与角色绑定,用户通过分配角色来获得相应的权限,而不是直接为用户分配权限。这种模型在大型企业系统、云服务、数据库管理系统等领域得到了广泛应用。
3.2、RBAC 的核心概念
-
用户(User):系统中需要访问资源的主体,通常指的是系统的实际使用者。
-
角色(Role):角色的定义是权限的集合。角色可以是一个职位、一个部门或者一个特定的功能组。通过将权限赋予角色,用户可以通过分配角色来获得相应的权限。
-
权限(Permission):权限是系统中对资源(如文件、数据库、接口等)的操作许可。权限通常包括读、写、执行等操作。
-
会话(Session):会话是用户与角色之间的动态关联。用户在登录系统时,可以激活一个或多个角色,从而获得相应的权限。
3.3、RBAC 的优势
-
简化权限管理:通过将权限赋予角色,而不是直接赋予用户,可以大大简化权限管理的复杂性。当权限发生变化时,只需要修改角色的权限,而不需要逐个修改用户的权限。
-
提高安全性:RBAC 通过角色和约束条件,可以更好地控制权限的分配,减少权限滥用和误操作的风险。
-
灵活性:RBAC 模型可以根据组织的结构和需求进行灵活的调整。例如,通过角色的继承关系,可以快速构建复杂的权限结构。
-
易于维护:当组织结构或业务流程发生变化时,只需要调整角色的定义和分配,而不需要大规模修改用户的权限。
3.4、RBAC 的实现步骤
- 定义角色
首先,需要根据业务需求定义系统中的角色。角色可以是职位、部门、功能组等。每个角色都需要明确其所包含的权限。
- 分配权限
为每个角色分配相应的权限。权限可以是系统中的操作许可,例如读取文件、修改数据库、执行某个功能等。
- 分配角色给用户
将角色分配给用户。用户通过分配的角色获得相应的权限。一个用户可以同时拥有多个角色,从而获得多个角色的权限。
- 配置会话
用户在登录系统时,可以激活一个或多个角色。系统根据用户激活的角色动态计算用户当前的权限。
- 实施约束条件
根据业务需求,配置角色之间的约束条件。例如,某些角色不能同时被分配给同一个用户,或者用户在同一时间段内不能激活多个冲突的角色。