iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >springboot使用ssh公钥连接mysql(含账号密码连接)
  • 787
分享到

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

mysqlsshspringboot 2023-09-02 16:09:50 787人浏览 泡泡鱼
摘要

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

引言

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

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

问题解决

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

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

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

  1. 引入依赖

    <dependency>    <groupId>com.jcraftgroupId>    <artifactId>jschartifactId>    <version>0.1.55version>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;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;        public void closeSSH() {        session.disconnect();    }        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;@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;@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连接的创建,可以采用私钥的方式,亦可以采用用户名密码的方式。

参考文章

来源地址:https://blog.csdn.net/qq_49137582/article/details/129335722

您可能感兴趣的文档:

--结束END--

本文标题: springboot使用ssh公钥连接mysql(含账号密码连接)

本文链接: https://www.lsjlt.com/news/391069.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • oracle怎么查询当前用户所有的表
    要查询当前用户拥有的所有表,可以使用以下 sql 命令:select * from user_tables; 如何查询当前用户拥有的所有表 要查询当前用户拥有的所有表,可以使...
    99+
    2024-05-14
    oracle
  • oracle怎么备份表中数据
    oracle 表数据备份的方法包括:导出数据 (exp):将表数据导出到外部文件。导入数据 (imp):将导出文件中的数据导入表中。用户管理的备份 (umr):允许用户控制备份和恢复过程...
    99+
    2024-05-14
    oracle
  • oracle怎么做到数据实时备份
    oracle 实时备份通过持续保持数据库和事务日志的副本来实现数据保护,提供快速恢复。实现机制主要包括归档重做日志和 asm 卷管理系统。它最小化数据丢失、加快恢复时间、消除手动备份任务...
    99+
    2024-05-14
    oracle 数据丢失
  • oracle怎么查询所有的表空间
    要查询 oracle 中的所有表空间,可以使用 sql 语句 "select tablespace_name from dba_tablespaces",其中 dba_tabl...
    99+
    2024-05-14
    oracle
  • oracle怎么创建新用户并赋予权限设置
    答案:要创建 oracle 新用户,请执行以下步骤:以具有 create user 权限的用户身份登录;在 sql*plus 窗口中输入 create user identified ...
    99+
    2024-05-14
    oracle
  • oracle怎么建立新用户
    在 oracle 数据库中创建用户的方法:使用 sql*plus 连接数据库;使用 create user 语法创建新用户;根据用户需要授予权限;注销并重新登录以使更改生效。 如何在 ...
    99+
    2024-05-14
    oracle
  • oracle怎么创建新用户并赋予权限密码
    本教程详细介绍了如何使用 oracle 创建一个新用户并授予其权限:创建新用户并设置密码。授予对特定表的读写权限。授予创建序列的权限。根据需要授予其他权限。 如何使用 Oracle 创...
    99+
    2024-05-14
    oracle
  • oracle怎么查询时间段内的数据记录表
    在 oracle 数据库中查询指定时间段内的数据记录表,可以使用 between 操作符,用于比较日期或时间的范围。语法:select * from table_name wh...
    99+
    2024-05-14
    oracle
  • oracle怎么查看表的分区
    问题:如何查看 oracle 表的分区?步骤:查询数据字典视图 all_tab_partitions,指定表名。结果显示分区名称、上边界值和下边界值。 如何查看 Oracle 表的分区...
    99+
    2024-05-14
    oracle
  • oracle怎么导入dump文件
    要导入 dump 文件,请先停止 oracle 服务,然后使用 impdp 命令。步骤包括:停止 oracle 数据库服务。导航到 oracle 数据泵工具目录。使用 impdp 命令导...
    99+
    2024-05-14
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作