SpringBoot整合Druid-Mybatis&SpringSecurity使用

2023-11-19

SpringBoot整合JDBC

创建springBoot项目时首先需要导入JDBC的支持,以及MySQL驱动

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--      mysql驱动  -->
<dependency>
  <groupId>com.mysql</groupId>
  <artifactId>mysql-connector-j</artifactId>
  <scope>runtime</scope>
</dependency>

配置yaml文件的数据源链接

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/sqltest?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

这里使用的是springBoot默认的数据源HikariDataSource,当然也可以继续使用其他扩展配置的数据源比如druid

springBoot内置各种组件,每个组件都有一个对应的原型Template类,我们可以通过该template类去调用对应的方法。并且spring会将该template进行自动装配

@Autowired // 自动装配bean:JdbcTemplate
private JdbcTemplate jdbcTemplate;
@GetMapping(value = "/userList")
@ResponseBody  // 返回值不走视图解析器  直接打印在视图
public List<Map<String,Object>> getBooks(){
  String sql = "select * from sqltest.books";
  List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
  return maps;
}

整合Druid数据源

springBoot提供的数据源HikariDataSource是目前主流数据源中速度最快的,而Druid的优势就在于它拥有日志监控功能,通过访问监控页面,我们可以实时的看到执行了哪些sql、执行细节、执行时间、以及查看数据源信息等等

首先导入Druid数据源依赖,要想使用Druid的日志监控功能也还需要导入log4j日志依赖,两种方式。第一种是导入原生的Druid依赖,不依赖于SpringBoot。但是现在SpringBoot已经提供了对Druid的支持,所以可以使用第二种,依赖如下

<!--     配置springBoot支持的druid数据源 以及log4j日志   -->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid-spring-boot-starter</artifactId>
  <version>1.1.22</version>
</dependency>
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

去SpringBoot配置文件中配置Druid的参数

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/sqltest?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    type: com.alibaba.druid.pool.DruidDataSource
    # springBoot默认不会配置以下属性值  需要手动绑定
    # druid 数据源专有配置
    initial-size: 5
    min-idle: 5
    max-active: 20
    max-wait: 60000
    time-between-eviction-runs-millis: 60000
    min-evictable-idle-time-millis: 300000
    validation-query: SELECT 1 FROM DUAL
    test-while-idle: true
    test-on-borrow: false
    test-on-return: false
    pool-prepared-statements: true
    #配置监控统计拦截的filters stat:监控统计、log4j日志记录  wall防御sql注入
    filters: stat,wall,log4j
    max-pool-prepared-statement-per-connection-size: 20
    use-global-data-source-stat: true
    connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

创建Druid配置类

@Configuration
public class DruidConfig {

  @Bean
  @ConfigurationProperties(prefix = "spring.datasource")
  public DataSource druid(){
    return new DruidDataSource();
  }

  // 配置druid监控
  @Bean
  public ServletRegistrationBean statViewServlet(){
    ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");
    //      配置druid登录监控界面的用户名和密码
    HashMap<String, String> initParam = new HashMap<>();
    initParam.put("loginUsername","root");
    initParam.put("loginPassword","123456");
    // 访问权限控制
    //后台允许谁可以访问
    //initParams.put("allow", "localhost"):表示只有本机可以访问
    //initParams.put("allow", ""):为空或者为null时,表示允许所有访问
    initParam.put("allow","");
    //deny:Druid 后台拒绝谁访问
    // initParams.put("msb", "192.168.1.20");//表示禁止此ip访问
    // 初始化参数
    bean.setInitParameters(initParam);
    return bean;
  }
  @Bean
  public FilterRegistrationBean webStatFilter(){
    FilterRegistrationBean bean = new FilterRegistrationBean();

    bean.setFilter(new WebStatFilter());

    HashMap<String, Object> initParams = new HashMap<>();
    // 这些请求  不进行监控统计
    initParams.put("exclusions","*.js,*.css,/druid/*");
    bean.setInitParameters(initParams);
    return bean;
  }
}

整合MyBatis

导入依赖,mybatis提供了与springBoot整合的依赖资源,导入在Pom.xml文件中即可

<!-- springBoot整合mybatis依赖 -->
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.1.3</version>
</dependency>

配置yaml文件,可以在yaml中绑定mybatis的核心配置文件、以及绑定mapper.xml的文件路径,和别名设置等

mybatis:
  type-aliases-package: com.yuqu.springboot02.pojo
  mapper-locations: classpath:mybatis/mapper/*.xml

mapper层

@Mapper  // 表示将该接口注册为bean托管给spring容器
@Repository  
public interface BookMapper {

也可以替换@Mapper为@MapperScan()设置扫描参数,扫描到的接口将会统一注册给spring管理

SpringSecurity

是一款基于Spring的安全框架,与shiro同是主流的安全性框架。使用springSecurity可以高效的针对“认证”和“权限”进行控制。所以springSecurity的两大核心就是用户认证Authentication用户授权Authorization

事实上,我们可以在不适用任何安全框架的情况下也可以实现对用户的认证和权限控制,比如拦截器。但是相对而言没有使用框架的可扩展性更高,并且使用更加方便。springsecurity已经封装好了大量的认证授权API供开发使用,我们只需要引入一个依赖即可

  1. 在创建的SpringBoot项目中引入springsecurity依赖即可
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  1. 创建springSecurity配置类继承WebSecurityConfigurerAdapter,然后重写管理认证方法和授权方法
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

  // 授权 参数为http  多针对请求过滤  为不同角色配置不同的访问权限
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    // 首页所有人可以访问
    // 功能也仅对应身份可以访问
    http.authorizeRequests()
      .antMatchers("/").permitAll()
      .antMatchers("/toLevel1/**").hasRole("vip1")
      .antMatchers("/toLevel2/**").hasRole("vip2")
      .antMatchers("/toLevel3/**").hasRole("vip3");
    // 没有权限自动跳转登录页  loginPage定制登录页面   loginProcessingUrl登录认证页面
 http.formLogin().loginPage("/toLogin").loginProcessingUrl("/login");
    // 开启注销功能  指定注销成功跳转页面
    http.logout().logoutSuccessUrl("/");
    // 開啓記住我功能  利用cookie實現 默認存活时间两周
    http.rememberMe().rememberMeParameter("remember");
    // 禁止csrf  跨站请求保护
    // SpringSecurity默认开启了CSRF防止网站攻击  会导致logout出现404因为logout为get请求
    // 可以将请求方式改为post即可  或者关闭csrf
    http.csrf().disable();
  }

  // 认证
  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    System.out.println("查看是否生效");
    auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
      .withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2")
      .and().withUser("gppp").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");
    //There is no PasswordEncoder mapped for the id "null"
    // 需要设置密码加密
    System.out.println("很好,,,生效了");
  }
}

springsecurity也可以与thymeleaf进行整合进行功能扩展,需要导入两者整合的依赖,但是各个版本可能会存在不一样的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot整合Druid-Mybatis&SpringSecurity使用 的相关文章

  • 枚举的子类化

    有没有一种简单的方法来子类化Javaenum 我问这个问题是因为我有大约 10 个实现相同接口的对象 但它们对某些方法也有相同的实现 因此我想通过将所有相同的实现放置在扩展的中间对象中来重用代码Enum它也是我需要的所有其他类的超类 或许事
  • 同一服务器上的许多应用程序具有相同的 JMX Mbean 类

    我有超过 5 个 Spring Web 应用程序 它们都在使用另一个通用库 这个公共库有它自己的 MBean 由于强制的唯一 objectName 约束 我的应用程序无法部署在同一服务器上 我使用 MBean 的方式是这样的 Managed
  • 连接外部 Accumulo 实例和 java

    我正在尝试使用 Accumulo 连接到虚拟机 问题是 我无法将其连接到 Java 中 我可以看到 Apache 抛出的网页 但我无法让它与代码一起工作 我认为这是缺乏知识的问题而不是真正的问题 但我找不到这方面的文档 所有示例都使用 lo
  • 非易失性领域的出版与阅读

    public class Factory private Singleton instance public Singleton getInstance Singleton res instance if res null synchron
  • Kafka - 如何同时使用过滤器和过滤器?

    我有一个 Kafka 流 它从一个主题获取数据 并且需要将该信息过滤到两个不同的主题 KStream
  • 如何在 Android 应用程序中隐藏 Flutterwave API 密钥

    我正在构建一个 Android 应用程序 目前正在将 Flutterwave 集成到我的应用程序中以进行支付 建议我永远不要将 Flutterwave API 密钥放在我的应用程序上 那么我该如何隐藏这些键呢 我正在使用 Retrofit
  • Java 中的 <-- 是什么? [复制]

    这个问题在这里已经有答案了 我遇到了下面的片段 它输出到4 3 2 1 我从来没有遇到过 lt 在爪哇 Is lt 使 var1 的值变为 var2 的运算符 public class Test public static void mai
  • 我们可以有条件地声明 spring bean 吗?

    有没有一种方法可以有条件地声明 Spring bean 例如
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • Mockito 和 Hamcrest:如何验证 Collection 参数的调用?

    我遇到了 Mockito 和 Hamcrest 的泛型问题 请假设以下界面 public interface Service void perform Collection
  • 2^31 次方的 Java 指数错误 [重复]

    这个问题在这里已经有答案了 我正在编写一个java程序来输出2的指数幂 顺便说一句 我不能使用Math pow 但是在 2 31 和 2 32 处我得到了其他东西 另外 我不打算接受负整数 My code class PrintPowers
  • 为什么解析这个 JSON 会抛出错误?

    我正在尝试解析这个 JSONObject query yahoo count 1 results rate Name USD INR id USDINR Time 12 19pm Date 10 31 2015 Bid 65 405 Ask
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • Tomcat 6 未从 WEB-INF/lib 加载 jar

    我正在尝试找出我的 tomcat 环境中的配置问题 我们的生产服务器正在运行 tomcat 安装并从共享 NFS 挂载读取战争 然而 当我尝试使用独立的盒子 及其配置 进行同样的战争时 我收到下面发布的错误 有趣的是 如果我将 WEB IN
  • 使用 Apache 允许 Glassfish 和 PHP 在同一服务器中协同工作

    是否可以建立从 Java 到 php 文件的桥梁 我有一个用 Java 编写的应用程序 我需要执行http piwik org http piwik org 这是用 PHP 编写的 在服务器中 我正在运行 PHP 但无法从浏览器访问 php
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • 检测到 JVM 正在关闭

    我有一个使用 addShutdownHook 处理 Ctrl C 的 Swing 应用程序 它工作正常 直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数 此时它挂起 我认为问题是 Swing EDT 已终止或正在等待某
  • Spring 作为 JNDI 提供者?

    我想使用 Spring 作为 JNDI 提供程序 这意味着我想在 Spring 上下文中配置一个 bean 可以通过 JNDI 访问该 bean 这看起来像这样

随机推荐

  • ubantu16.04安装Anaconda

    1 官网下载安装包 我下载的是python 3 10版本的 后续用tvm要求python版本在 3 7 3 8 记得创建一个虚拟环境 Anaconda历史版本链接 https repo anaconda com archive 2 开始安装
  • 【项目实战】复旦微MCU+RT-thread+Moudbus(1)

    前言 手头存货FM33LC046芯片 复旦微提供的是freertos和rthread nano的例子 一直想使用RTThread完整版 MCU由于ROM有限 项目因此不可能太复杂 怕后期资源不够 第一步 git源码https gitee c
  • Activiti-设置全局变量的四种方法

    1 在流程启动的时候设置全局变量 在流程启动时设置全局变量 Test public void startProcessInstance 得到runtimeService RuntimeService runtimeService proce
  • 如何在Controller层实现事务管理?

    在spring aop 事务管理中发现 我们是在service层实现的事务管理 现在有如下场景 大家讨论下看如何实现 ControllerA ControllerB ControllerC 共同依赖ServiceA ServiceB 上述C
  • Java特训的第一天——开篇

    我是一名刚入门的Java菜鸟 我选择Java的原因是因为其语法简单 功能强大 从web 到桌面 到嵌入式 无所不能 下面我将谈一谈我对Java语言的认识 Java语言概述 关于Java的介绍网上有很详细的阐述 我在这里就不再细述了 下面只简
  • 非谓语动词

    文章目录 1 to 动词原形或动词原形 ing 1 1 动词不定式 1 2 动名词 2 假主语 真主语和不定式 动名词的否定式 2 1 形式主语 2 2 形式宾语 2 3 动名词或不定式否定 3 to不定式表示目的 4 常见的不定式和动名词
  • 【vue网站优化】秒开网页

    vue网站优化 网页渲染速度快到极致 在将打包后的dist目录上传到服务器时 往往会出现首次加载页面速度较慢的情况 以下给出几点优化意见 在路由配置文件中 采用路由懒加载 当打包构建应用时 JavaScript 包会变得非常大 影响页面加载
  • SQL注入的常见方式

    目录 联合查询 union 函数介绍 order by union select 操作 布尔盲注 and or 函数介绍 mid 从中间截取字符 left 从左开始截取字符 ord ascii 转成ascii码 length 统计长度 an
  • 循环嵌套与简单调用

    循环嵌套与简单调用 一 循环嵌套 1 循环嵌套 for 条件初始化 条件判断 条件变化 重复执行的代码 for 条件初始化 条件判断 条件变化 重复执行的代码 重复执行的代码 特点 外层循环执行一次 内层小循环执行一轮 从开始到结束 外层循
  • C0202 [2010普及组-A]数字统计(C语言写)

    题目描述 请统计某个给定范围 L R 的所有整数中 数字 2 出现的次数 比如给定范围 2 22 数字 2在数 2 中出现了 1 次 在数 12 中出现 1 次 在数 20 中出现 1 次 在 数 21中出现 1 次 在数 22 中出现 2
  • QT5.15编译2

    准备工作 必须 第一步 Qt 源码下载 https download qt io official releases qt Qt Creator 源码下载 https download qt io official releases qtc
  • RabbitMQ重复消费

    文章目录 前言 重复消费问题 方法一 消息幂等性 方法二 消息去重 前言 解决 RabbitMQ 重复消费问题是消息队列应用中非常重要的一部分 在实际应用中 可能会出现消费者因某种原因 例如网络问题 应用崩溃等 在处理消息时失败 然后重新开
  • 4.2.1测试网络基础结构配置

    测试网络基础结构配置 ID WSTG CONF 01 总结 互连和异构 Web 服务器基础结构 可能包括数百个 Web 应用程序 的内在复杂性使得配置管理和审查成为测试和部署每个应用程序的基本步骤 只需要一个漏洞就可以破坏整个基础架构的安全
  • HTTP(GET/POST)请求过程中的编码问题

    一 问题 编码问题是JAVA初学者在web开发过程中经常会遇到问题 网上也有大量相关的文章介绍 但其中很多文章并没有对URL中使用了中文等非ASCII的字 符造成服务器后台程序解析出现乱码的问题作出准确的解释和说明 本文将详细介绍由于在UR
  • MATLAB中的eps的详细解释及用法

    1 首先 eps是一个函数 它表示的是一个数可以分辨的最小精度 默认时它表示1到它下一个浮点数之间的距离的一半 而正好等于最大小于1的浮点数到最小大于1的浮点数之间的距离 eps 2 2204e 16 下面是eps的默认精度 注 以下演示环
  • git高级用法之rebase

    rebase的高级用法 这里介绍两种高级用法 1 合并连续的或者不连续的两个提交记录 删除任意一个提交记录 改变提交记录的先后顺序 2 通过rebase合并分支 合并连续的两个提交 如下图的场景 gl是git log的缩写 不过也没这么简单
  • mybatis 循环集合查询

    数据库语句为 select from user where 张三 李四 王五 那么想用mybatis Mapper y entity 定义一个集合属性作为参数 private List searchName dao层 定义一个映射mappe
  • 使用MobaXterm连接到远程服务器

    仅供参考 文章目录 TOC 文章目录 一 前期准备 二 步骤 1 点击上册工具栏的Session 在弹出的窗口里选择SSH 2 点击Network settings 再点击中间的jump host 3 在弹出界面填入所需信息 并点击OK保存
  • 云原生服务更换二进制调测方法

    当前我们开发的服务基本都是云原生的服务 都跑在容器中 在开发过程中 想更换二进制文件调测就相当麻烦了 今天写了一个脚本 供大家参考 bin bash set ex appName testApp appPath home appName c
  • SpringBoot整合Druid-Mybatis&SpringSecurity使用

    SpringBoot整合JDBC 创建springBoot项目时首先需要导入JDBC的支持 以及MySQL驱动