监听器与RBAC权限模型

news2025/1/13 0:21:38

目录

  • 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 接口定义了两个方法:

  1. contextInitialized(ServletContextEvent sce)

    • 当 Web 应用程序启动时,Servlet 容器会调用此方法。
    • 你可以在这个方法中执行一些初始化操作。
  2. contextDestroyed(ServletContextEvent sce)

    • 当 Web 应用程序关闭时,Servlet 容器会调用此方法。
    • 你可以在这个方法中执行一些清理操作。

1.3、实现步骤

  1. 创建一个实现 ServletContextListener 接口的类

    • 你需要创建一个类并实现 ServletContextListener 接口,然后重写 contextInitializedcontextDestroyed 方法。
  2. 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 {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // Web 应用程序启动时执行
        System.out.println("Web 应用程序启动,执行初始化操作...");
        // 例如:加载配置文件、初始化数据库连接池等
    }

    @Override
    public 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/javaee
                             http://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、使用场景

  1. 加载配置文件

    • contextInitialized 方法中加载应用程序的配置文件,例如数据库连接信息、系统参数等。
  2. 初始化数据库连接池

    • contextInitialized 方法中初始化数据库连接池,以便在应用程序运行时可以快速获取数据库连接。
  3. 注册自定义的 Servlet 或 Filter

    • contextInitialized 方法中动态注册自定义的 Servlet 或 Filter。
  4. 释放资源

    • contextDestroyed 方法中关闭数据库连接、释放线程池等资源。

2、德鲁伊数据源

DruidDataSource 是阿里巴巴开源的高性能连接池组件,广泛应用于 Java 应用程序中,特别是在与数据库进行交互时。可以利用Servlet上下文监听器建立工程中需要的数据源。

2.1、主要特性

  1. 高性能:Druid 在连接池管理和数据库访问方面进行了大量的优化,使得它在高并发场景下表现优异。
  2. 监控功能:Druid 提供了丰富的监控功能,可以通过 JMX、Web 监控页面等方式监控连接池的状态和 SQL 语句的执行情况。
  3. 日志功能:Druid 可以记录 SQL 语句的执行情况,帮助你定位和优化 SQL 语句。
  4. 配置灵活:Druid 提供了丰富的配置项,可以根据不同的应用场景进行灵活配置。
  5. 内置 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 的核心概念

  1. 用户(User):系统中需要访问资源的主体,通常指的是系统的实际使用者。

  2. 角色(Role):角色的定义是权限的集合。角色可以是一个职位、一个部门或者一个特定的功能组。通过将权限赋予角色,用户可以通过分配角色来获得相应的权限。

  3. 权限(Permission):权限是系统中对资源(如文件、数据库、接口等)的操作许可。权限通常包括读、写、执行等操作。

  4. 会话(Session):会话是用户与角色之间的动态关联。用户在登录系统时,可以激活一个或多个角色,从而获得相应的权限。

3.3、RBAC 的优势

  1. 简化权限管理:通过将权限赋予角色,而不是直接赋予用户,可以大大简化权限管理的复杂性。当权限发生变化时,只需要修改角色的权限,而不需要逐个修改用户的权限。

  2. 提高安全性:RBAC 通过角色和约束条件,可以更好地控制权限的分配,减少权限滥用和误操作的风险。

  3. 灵活性:RBAC 模型可以根据组织的结构和需求进行灵活的调整。例如,通过角色的继承关系,可以快速构建复杂的权限结构。

  4. 易于维护:当组织结构或业务流程发生变化时,只需要调整角色的定义和分配,而不需要大规模修改用户的权限。

3.4、RBAC 的实现步骤

  1. 定义角色

首先,需要根据业务需求定义系统中的角色。角色可以是职位、部门、功能组等。每个角色都需要明确其所包含的权限。

  1. 分配权限

为每个角色分配相应的权限。权限可以是系统中的操作许可,例如读取文件、修改数据库、执行某个功能等。

  1. 分配角色给用户

将角色分配给用户。用户通过分配的角色获得相应的权限。一个用户可以同时拥有多个角色,从而获得多个角色的权限。

  1. 配置会话

用户在登录系统时,可以激活一个或多个角色。系统根据用户激活的角色动态计算用户当前的权限。

  1. 实施约束条件

根据业务需求,配置角色之间的约束条件。例如,某些角色不能同时被分配给同一个用户,或者用户在同一时间段内不能激活多个冲突的角色。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2275720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Framework 5.3.x源码构建 (jdk-1.8, gradle 7.5.1, idea2024.3)

1、下载jdk安装并配置环境变量&#xff08;自行百度&#xff09; https://www.oracle.com/java/technologies/downloads/#java8 2、下载spring-framework源码&#xff0c;切换分支到5.3.x https://github.com/spring-projects/spring-framework.git 备用地址 https://gitco…

韩顺平老师Linux学习笔记【持续更新...】

1、课程内容 1.1、课程大纲 1.2、Linux使用在哪些地方 Linux运维工程师Linux嵌入式工程师Linux下开发项目&#xff1a;JavaEE、大数据、Python、PHP、C/C、Go 1.3、Linux的应用领域 个人桌面领域服务器领域&#xff08;最强领域&#xff09;嵌入式领域 2、Linux入门 2.1、…

代码随想录算法训练营day27

代码随想录算法训练营 —day27 文章目录 代码随想录算法训练营前言一、贪心算法理论基础二、455.分发饼干三、376. 摆动序列53. 最大子数组和总结 前言 今天是算法营的第27天&#xff0c;希望自己能够坚持下来&#xff01; 今日任务&#xff1a; ● 贪心算法理论基础 ● 455.…

浅谈容灾技术方案详解

一、什么是容灾&#xff1f; 容灾指的是&#xff0c;在异地搭建一套或多套和主生产系统一样的IT系统&#xff0c;用于应对在系统因发生意外&#xff08;自然灾害、人为灾害、设备系统故障等&#xff09;造成业务影响的情况&#xff0c;达到尽量让生产业务损失最小的目的。 二…

《框架程序设计》期末复习

目录 Maven 简介 工作机制&#xff08;★&#xff09; 依赖配置&#xff08;★&#xff09; Maven命令 MyBatis 入门 单参数查询&#xff08;★&#xff09; 多参数查询&#xff08;★★★&#xff09; 自定义映射关系&#xff08;★★★&#xff09; 基本增删改查操…

SDK调用文心一言如何接入,文心一言API接入教程

一、前期准备 注册百度智能云账号&#xff1a; 前往百度智能云官网注册一个账号。这是接入文心一言API的基础。 了解API接口&#xff1a; 在百度智能云开放平台中&#xff0c;找到文心一言API的详情页&#xff0c;了解提供的API接口类型&#xff08;如云端API、移动端API、离线…

刚体变换矩阵的逆

刚体运动中的变换矩阵为&#xff1a; 求得变换矩阵的逆矩阵为&#xff1a; opencv应用 cv::Mat R; cv::Mat t;R.t(), -R.t()*t

<style lang=“scss“ scoped>: 这是更常见的写法,也是官方文档中推荐的写法

这两种写法在大多数情况下是没有区别的&#xff0c;它们都是 Vue.js 单文件组件 (.vue 文件) 中用来定义组件私有样式的方式。 两种写法&#xff1a; <style lang"scss" scoped>: 这是更常见的写法&#xff0c;也是官方文档中推荐的写法。<style scoped l…

ai,seo,关键词

什么是AI在SEO中的应用 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;在搜索引擎优化&#xff08;SEO&#xff09;领域的应用正变得愈发重要。AI技术能够处理和分析大量的数据&#xff0c;通过识别用户行为和搜索模式&#xff0c;帮助优化网站内容和结构。…

git - 用SSH方式迁出远端git库

文章目录 git - 用SSH方式迁出远端git库概述笔记以gitee为例产生RSA密钥对 备注githubEND git - 用SSH方式迁出远端git库 概述 最近一段时间&#xff0c;在网络没问题的情况下&#xff0c;用git方式直接迁出git库总是会失败。 失败都是在远端, 显示RPC错误。 但是git服务器端…

slurm部署安装

slurm部署安装 管理节点和计算节点 在所有节点执行 安装系统工具 apt install -y build-essential curl wget munge将hosts文件 vim /etc/hostsxxx.xxx.xxx.xxx xxx分发到其他计算节点创建slurm用户 useradd -m slurm mkdir /var/spool/slurmd /var/spool/slurmctld chow…

初识Java 2

目录 一.方法&#xff08;函数&#xff09; 1.方法的定义 2.方法的调用过程 3.实参与形参的关系 4.方法的重载 5.方法签名&#xff08;了解&#xff09; 6.递归&#xff08;常用于数列&#xff0c;阶乘&#xff09; 二.数组 1.定义方法&#xff1a; 2.初始化&#xff…

react-quill 富文本组件编写和应用

index.tsx文件 import React, { useRef, useState } from react; import { Modal, Button } from antd; import RichEditor from ./RichEditor;const AnchorTouchHistory: React.FC () > {const editorRef useRef<any>(null);const [isModalVisible, setIsModalVis…

关于扫描模型 拓扑 和 传递贴图工作流笔记

关于MAYA拓扑和传递贴图的操作笔记 一、拓扑低模: 1、拓扑工作区位置: 1、准备出 目标 高模。 (高模的状态如上 ↑ )。 2、打开顶点吸附,和建模工具区,选择四边形绘制. 2、拓扑快捷键使…

【Rust自学】11.9. 单元测试

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.9.1. 测试的分类 Rust把测试分为两类&#xff0c;一个是单元测试&#xff0c;一个是集成…

【竞技宝】CS2:HLTV2024选手排名TOP4-NiKo

北京时间2025年1月11日,HLTV年度选手排名正在持续公布中,今日凌晨正式公布了今年的TOP4选手为G2(目前已转为至Falcons)战队的NiKo。 选手简介 NiKo是一名来自波黑的CS职业选手,现年26岁。作为DOTA2饱负盛名的职业选手,NiKo在CS1.6时代就已经开始征战职业赛场。2012年,年仅15岁…

rom定制系列------小米max3安卓12 miui14批量线刷 默认开启usb功能选项 插电自启等

小米Max3是小米公司于2018年7月19日发布的机型。此机型后在没有max新型号。采用全金属一体机身设计&#xff0c;配备6.9英寸全面屏.八核处理器骁龙636&#xff0c;后置双摄像头1200万500万像素&#xff0c;前置800万像素.机型代码 &#xff1a;nitrogen.官方最终版为稳定版12.5…

Linux第一课:c语言 学习记录day06

四、数组 冒泡排序 两两比较&#xff0c;第 j 个和 j1 个比较 int a[5] {5, 4, 3, 2, 1}; 第一轮&#xff1a;i 0 n&#xff1a;n个数&#xff0c;比较 n-1-i 次 4 5 3 2 1 // 第一次比较 j 0 4 3 5 2 1 // 第二次比较 j 1 4 3 2 5 1 // 第三次比较 j 2 4 3 2 1 5 // …

Cline(原Claude Dev)开源的IDE AI插件,如何搭配OpenRouter实现cursor功能,Cline怎么使用

Cline&#xff08;原Claude Dev&#xff09;是一个开源的IDE AI插件&#xff0c;可以使用你的命令行界面和编辑器的人工智能助手。 你可以直接在VS Code编辑器进行安装。如果你使用过Cursor AI IDE的话&#xff0c;可以尝试最新发布的Cline3.1版本。 在OpenRouter上&#xff0…

arcgis的合并、相交、融合、裁剪、联合、标识操作的区别和使用

1、相交 需要输入两个面要素&#xff0c;最终得到的是两个输入面要素相交部分的结果面要素。 2、合并 合并能将两个单独存放的两个要素类的内容&#xff0c;汇集到一个要素类里面。 3、融合 融合能将一个要素类内的所有元素融合成一个整体。 4、裁剪 裁剪需要输入两个面要…