springboot使用ssh公钥连接mysql(含账号密码连接)

2023-05-16

引言

在项目开发过程中,遇到了连接数据库时需要使用ssh公钥的情况。在本地使用navicat可以直接通过可视化界面去进行ssh的连接,但是在java中无法直接去进行连接。

后来经过查询资料,发现必须要在java中编写相关配置文件后才可以正常连接。

问题解决

原理:程序在本机创建ssh连接,连接到ssh server,然后再发送数据库操作指令,指令会被转发到目标数据库服务器上,返回操作结果

**前提:**项目已经配置好mysql连接所需要参数

**注意:**我演示的是使用ssh的公钥模式进行连接,如果需要使用密码模式进行连接,需要打开和关闭某些注释

  1. 引入依赖

    <dependency>
        <groupId>com.jcraft</groupId>
        <artifactId>jsch</artifactId>
        <version>0.1.55</version>
    </dependency>
    
  2. 编写ssh连接配置类

    package com.lzj.config;
    
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.JSchException;
    import com.jcraft.jsch.Session;
    
    import java.util.Properties;
    
    /**
     * <p>
     *  SSH连接配置类
     * </p>
     *
     * @author:雷子杰
     * @date:2023/3/4
     */
    public class SSHConnectionConfig {
    
        //本地的ssh中的knownhost文件路径
        private String SSH_PATH_FILE_KNOWN_HOSTS = "C:\\Users\\86158\\.ssh\\known_hosts";
        //本地的ssh密钥路径
        private String SSH_PATH_FILE_PRIVATE_KEY = "**********************************";
        //ssh连接的用户名
        private String SSH_USER = "******";
        //ssh远程连接的ip地址
        private String SSH_REMOTE_SERVER = "65.115.26.30";
        //ssh连接的端口号,一般默认为22
        private Integer SSH_REMOTE_PORT = 22;
        //SSH使用密码
        //private String sshPassword;
    
        //本地mysql发起连接的IP地址
        private String MYSQL_REMOTE_SERVER = "127.0.0.1";
        //本地数据库连接时用的端口号(不能填3306)
        private Integer LOCAl_PORT = 3307;
        //远程数据库端口用的端口号
        private Integer REMOTE_PORT = 3309;
    
        //com.jcraft.jsch.Session;
        private Session session;
    
        /**
         * 关闭ssh连接
         */
        public void closeSSH() {
            session.disconnect();
        }
    
        /**
         * 创建ssh连接
         */
        public void createSSH() throws JSchException {
            JSch jSch = new JSch();
    
            //下面这两个设置是在公钥模式需要设置的,非公钥模式不需要进行设置
            //设置known_hosts文件路径,如:~/.ssh/known_hosts(known_hosts中存储是已认证的远程主机host key)
            jSch.setKnownHosts(SSH_PATH_FILE_KNOWN_HOSTS);
            //设置私钥
            jSch.addIdentity(SSH_PATH_FILE_PRIVATE_KEY);
    
            session = jSch.getSession(SSH_USER, SSH_REMOTE_SERVER, SSH_REMOTE_PORT);
    
            //如果是密码模式需要设置密码
            //session.setPassword(sshPassword);
    
            //设置连接过程不校验known_hosts文件中的信息
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
    
            //ssh 建立连接!
            session.connect();
    
            //根据安全策略,您必须通过转发端口进行连接
            session.setPortForwardingL(LOCAl_PORT, MYSQL_REMOTE_SERVER, REMOTE_PORT);
        }
    }
    
  3. 编写监听器

    注意:

    1. Listener类使用@WebListener注解;
    2. SpringBoot的启动类需要增加@ServletComponentScan用于扫描加载Listener类;

    经过我的尝试,发现如果使用了@Component注解,就算不使用@WebListener也同样可以完成监听功能

    package com.lzj.config;
    
    import org.springframework.stereotype.Component;
    
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
    
    /**
     * <p>
     *
     * </p>
     *
     * @author:雷子杰
     * @date:2023/3/4
     */
    @Component//尽量加上这个
    @WebListener//声明为监听器
    public class MyContextListener implements ServletContextListener {
    
        private SSHConnectionConfig sshConnectionConfig;
    
        public MyContextListener() {
            super();
        }
    
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            System.out.println("Context initialized ... !");
            try {
                sshConnectionConfig = new SSHConnectionConfig();
                sshConnectionConfig.createSSH();
            } catch (Throwable e) {
                e.printStackTrace(); // 连接失败
            }
    
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            System.out.println("Context destroyed ... !");
            sshConnectionConfig.closeSSH();//断开ssh连接
        }
    }
    
  4. 注意可能需要修改你的mysql连接配置

    可以看见我的的url中的localhost:3307,这个ip和端口号是根据你编写的ssh配置类MYSQL_REMOTE_SERVERLOCAl_PORT来的,你可能需要进行修改

    spring:
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        username: root
        password: ******
        url: jdbc:mysql://localhost:3307/leopard-vendor_cloud?autoReconnect=true&useUnicode=true&useSSL=false
    
  5. 测试

    编写一个测试类测试数据库的连接

    package com.lzj;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import javax.sql.DataSource;
    import java.sql.SQLException;
    
    /**
     * <p>
     *
     * </p>
     *
     * @author:雷子杰
     * @date:2023/3/3
     */
    @SpringBootTest(classes = SpringbootDetabaseApplication.class)
    @RunWith(SpringRunner.class)
    public class InitTest {
    
        @Autowired
        private DataSource dataSource;
    
        @Test
        public void testDataSource() throws SQLException {
    
            System.out.println(dataSource.getConnection());
        }
    }
    

    测试结果如下:

    image-20230304155236024

    可以发现控制台正常输出了连接相关信息

总结

image-20230304160003390

**注意:**数据库连接地址由原来的123.mysql.com:3306改为127.0.0.1:3307,这样子,ssh连接会为每一个127.0.0.1:3307上的操作转发到123.mysql.com:3306上去,便可以正常操作数据库了。ssh连接的创建,可以采用私钥的方式,亦可以采用用户名密码的方式。

参考文章

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

springboot使用ssh公钥连接mysql(含账号密码连接) 的相关文章

  • IDEA通过maven配置Spring保姆级教程

    写在前面 xff1a 此篇文章主要是记录IDEA利用maven配置Spring的全过程 由于本人也是慢慢探索出来的 xff0c 所以有不全或者遗漏的地方 xff0c 还请大家斧正 请耐心看完文章 xff0c 前期工作做完后IDEA才可以配置
  • 策略梯度算法(Policy Gradient)逐行代码详解

    理论部分以及完整代码参看之前的博客 xff1a https blog csdn net qq 47997583 article details 124506650 本文章介绍的是策略梯度算法中的REINFORCE实现 上图为算法流程图 xf
  • python爬虫(自动下载图片)

    爬虫第一步下载第三方工具 requests包 win 43 R 输入cmd点击确定或回车 输入以下命令下载requests包 requests包是python爬虫常用的包 他的下载方式是 pip install requsts 如果觉得下载
  • python json格式转字典

    impor json req 61 json loads 转换的内容
  • mysql安装5.7出现闪退解决办法

    MySQL下载官网 下载地址 xff1a https dev mysql com downloads mysql 我之前用的是5 5的版本升级到5 7是将所有的数据生成到文件里 命令 mysqldump u root p all datab
  • 小程序设置、获取本都缓存、发送请求、渲染数据、转发当前页面、下拉刷新页面

    设置 获取缓存 xff0c 发送请求 xff0c 渲染数据 xff0c 转发当前页面 设置 获取本地缓存设置本地缓存 xff08 wx setStorage xff09 获取本地缓存 xff08 wx getStorageSync xff0
  • cnpm安装步骤

    安装nodeJS 官网下载 xff1a http nodejs cn download 选择其他版本下载地址 https nodejs org zh cn download releases 选版本点击下载 然后下载后缀名为msi 因为安装
  • likeadmin权限管理菜单报错:AxiosError

    报错图片 xff1a 这个原因是后端返回的 JSON 数据太多而导致前端报错 xff0c 可能是因为前端无法处理大量数据 下面是一些可能导致前端代码处理大量数据出现问题 返回json数据中的末尾有说到数据太多了的原因 然后我去数据库的sys
  • Vue安装

    Vue安装 一 安装二 使用步骤1 在项目中使用vue2 使用命令创建vue项目 一 安装 安装vue之前需要安装nodeJS 1 需要安装Node js 可以从官方网站进行下载并安装 2 这篇博客有详细的步骤 Node js安装详解 3
  • Thinkphp6模型关联

    文章目录 前言一 一对一关联示例 二 一对多三 多对多四 示例总结hasManybelongsTohasOne 前言 ThinkPHP 6 模型关联是指使用 PHP 对象关系映射 xff08 ORM xff09 机制 xff0c 通过模型类
  • Linux----生产者与消费者

    生产者与消费者 模型场景分析 xff1a 编程流程 xff1a 生产者同步流程消费者同步流程 代码实现主函数生产者线程函数消费者线程函数 模型场景 分析 xff1a 缓冲区buff中存放数据 生产者和消费者数目不固定 xff0c 生产者向缓
  • 一篇文章了解Like用法及常见索引失效情况

    1 简介 本文主要通过介绍Like索引及常见索引失效情况 xff0c 以MySQL为例 2 EXPLAIN关键字 一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划 EXPLAIN 语句 就可以看到某
  • Linux——进程和计划任务管理(理论+实验)

    目录 前言一 程序 进程线程概述1 1 程序1 2 进程1 3 线程1 4 程序 进程和线程的关系1 5 程序和进程的关系 二 查看进程2 1 1 ps 命令 查看静态的进程统计信息 xff08 Processes Statistic xf
  • Uncaught SyntaxError: Unexpected token ‘var‘

    遇到Uncaught SyntaxError Unexpected token 39 var 怎么去解决 1 发现报错 xff0c 就去找报错 2 怎么查找这个报错并修改这个报错 3 为什么我写的时候没有提示报错 xff0c 运行的时候才显
  • 如何使用Maven创建Mybatis项目

    1 打开idea xff0c 依次点击左上角的File gt New gt project 2 选择Maven xff0c 然后点击Next 3 通过点击这个文件夹进行文件存放地址的改变 xff0c 然后输入项目的名字 4 再点击Finis
  • 树莓派3B+raspbian+docker+hassio安装教程

    说明 1 此文转载 侵删 参考https bbs hassbian com thread 3501 1 1 html 2 修改echo 34 96 date 43 H M S 96 gt gt gt gt gt gt gt gt gt gt
  • Linux - 开机启动流程

    目录 一 掌握开机启动流程的意义 xff1a 1 1 为什么需要了解开机启动流程 xff1f 1 2 在日常的运维过程中 xff0c 是否会遇到机器出现问题启动不了 xff1f 1 3 开机启动流程的意义 二 开机启动流程 2 1 开机启动
  • 关于Ubuntu中出现:Unable to fetch some archives, maybe run apt-get update or try with --fix-missing问题

    在Ubuntu有网络的情况下 xff0c 如果出现在进行 apt update或者apt install时 xff0c 出现Unable to fetch some archives maybe run apt get update or
  • 2022年宜春市职业院校技能大赛中职组“网络搭建与应用”赛项任务书

    2022年宜春市职业院校技能大赛中职组 网络搭建与应用 赛项任务书 xff08 总分1000分 xff09 赛题说明 一 竞赛内容分布 网络搭建与应用 竞赛共分二个部分 xff0c 其中 xff1a 第一部分 xff1a 网络搭建及安全部署
  • Java之变量的作用域和初始化

    write xff1a 2022 4 28 前文我们学习了Java的数据类型 xff1a Java之数据类型 xff0c 本文我们学习变量的作用域和初始化 xff0c 文中有大量使用实例讲解分析 xff0c 需耐心解读代码 文章目录 1 变

随机推荐

  • springboot集成mybatis:查询数据库,返回的结果为null的解决办法

    springboot集成mybatis xff1a 查询数据库 xff0c 返回的结果为null的解决办法 问题重现 xff1a 数据库中的数据 查询的结果 xff1a 也就是说我数据库中有几个数据就有几个null值 这就很奇怪了 xff0
  • springboot使用thymeleaf后找不到模板(五个细节)已解决

    问题 xff1a springboot使用thymeleaf模板后找不到html模板 第一种情况 xff1a 先说第一种情况 xff0c 也是我出现问题的原因 xff1a 那就是导入thymeleaf的命名空间后 xff0c 粗心大意的将t
  • 一篇实现springboot集成elasticsearch的增删改查

    准备工作 springboot版本 span class token generics span class token punctuation lt span parent span class token punctuation gt
  • centos7连接不上网络,保姆级演示,亲测,亲测

    centos连接网络无非就大 五步 写在前边 xff1a vmware16 centos7 1 打开vm xff1a 编辑 虚拟网络编辑器 更改设置 2 有三个网络名称 VMnet0 xff1a 选择仅主机模式 xff0c 勾选下边两个选项
  • 简单三步,实现idea远程debug

    远程debug xff0c 简单三步 这里默认你已经打好了jar包 第一步 xff0c 编辑idea配置 1 1 点击edit configurations 1 2 点击 43 号选择Remote JVM Debug 1 3 进行配置 xf
  • shell把变量的值作为变量使用

    有那么一种生产环境 我有一个变量 xff0c 变量有一个初始值比如count 61 1 我想将count计算或者处理后的值再次作为参数传递 举个例子 span class token assign left variable name sp
  • lamp配置

    lamp独立配置 简介 所谓lamp xff0c 其实就是由Linux 43 Apache 43 Mysql MariaDB 43 Php Perl Python的一组动态网站或者服务器的开源软件 xff0c 除Linux外其它各部件本身都
  • Archlinux系统屏幕花屏

    我的电脑 xff0c 联想Y7000 xff0c 2019款 xff0c Archlinux内核版本 xff0c 系统情况如下 花屏样例 xff0c 这只是其中一种花屏样式 xff0c 屏幕一直不受控制的在闪动 出现这种情况不难猜到是显卡驱
  • centos7 使用letsEncrypt certbot 生成免费的ssl证书 渐进学习

    1 我们将会使用letsencrypt证书颁发机构里的certbot客户端 certbot官网 xff0c 国内也可访问 https certbot eff org 2 准备工作 xff0c 这一步很重要 你首先需要有一个解析通过了的域名
  • CSS选择器

    c选择器表示要定义样式的对象 xff0c 可以是元素本身 xff0c 也可以是一类元素或者指定名称的元素 一 选择器的分类 1 元素选择器 xff1a 以标签名作为选择器的一种方式 xff0c 例如 xff1a p h1 h6 div ul
  • 多生产者多消费者解决方式

    在上一篇博客中记录了如何解决普通生产者消费者的问题 xff0c 这篇讲一下如何解决多生产者多消费者问题 多生产者多消费者问题案例 xff1a 一家四口围着一个盘子 xff0c 盘子中最多放两个水果 爸爸不断向盘子中投放苹果 xff0c 儿子
  • 关于Java NoSuchElementException: No value present以及java.lang.NullPointerException处理

    1 Java NoSuchElementException No value present while curSum lt 100 找出小数余额最大的组 xff0c 对其进行加1 CircleRequest max 61 list str
  • 手机号无法验证,如何注册推特

    Twitter无法添加 验证中国手机号码 xff1f 既然Twitter无法添加 验证中国手机号码 xff0c 怎么解冻呢 xff1f 以下是推特注册时 xff0c 验证 43 86手机号解决方法 xff1a 进入账号申诉页面 点此进入 T
  • vue安装vue-router出错

    项目场景 xff1a 在vue中安装vue router 问题描述 xff1a 提示 xff1a 在安装过程中报错 xff0c 缺少依赖 xff1a PS D span class token punctuation span WebDep
  • SpringBoot之SpringSecurity(安全)

    SpringSecurity xff08 安全 xff09 Spring Security是针对Spring项目的安全框架 xff0c 也是Spring Boot底层安全模块默认的技术选型 xff0c 他可以实现强大的Web安全控制 xff
  • 解决决SpringBoot图片上传需重启服务器才能显示的问题

    问题描述 xff1a 前端页面实现头像图片上传并实时更新显示的功能 xff0c 但是文件上传成功后不能实时显示 xff0c 必须重启服务器后才能显示出来 下图是我将图片文件上到到的目录 xff0c 及项目架构 问题发生的原因 这是服务器的自
  • html页面实现登录验证码功能(纯前端)

    html 43 css 43 javascript简易实现注册或登录时实现验证码功能 xff1a 原文链接 xff1a https blog csdn net weixin 41472431 article details 90732468
  • lvs2种模式和haproxy配置

    lvs配置方法 nat模式配置 ip类型ip地址VIP仅主机模式192 168 96 134DIP192 168 149 143host1IP192 168 149 140host2IP192 168 149 137 host1配置 spa
  • js中复选框checkbox如何判定为被选中

    在学习的过程中触及到html分离式开发的内容 xff0c 其中复选框checkbox判定选中对于ajax传数据来说十分重要 xff0c 故将该篇文章转发留存 xff0c 方便以后查阅 要想判定复选框选中状态可以使用 xff1a 34 tes
  • springboot使用ssh公钥连接mysql(含账号密码连接)

    引言 在项目开发过程中 xff0c 遇到了连接数据库时需要使用ssh公钥的情况 在本地使用navicat可以直接通过可视化界面去进行ssh的连接 xff0c 但是在java中无法直接去进行连接 后来经过查询资料 xff0c 发现必须要在ja