Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

SpringBoot通过SSH连接服务器数据库

有一些情况下,数据库为了安全起见,往往只允许一些特定的 IP 进行连接,而此时我们其他的服务区想对其进行连接,一种方法是使得该数据库允许我们的服务器对其进行连接,一种是将数据库设置成所有人可连接,还有一种方法就是本文我们所讲的方法:通过 SSH 连接到被允许链接的服务器 IP ,将此服务器作为一个支点,然后再连接到数据库中。

This is a picture without description

以 Mysql 数据库为例,我们通过以下的步骤以及对其进行连接。

1、实现方法

1.1、引入依赖

新建一个 SpringBoot 项目,引入以下的依赖:
该依赖是 Mysql 数据库进行 SSH 连接所必需的一个依赖,不能缺少。

1
2
3
4
5
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>

1.2、创建连接

然后新建一个工具类SSHConnection,里面编写的是SSH连接服务器的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class SSHConnection {

/**
* linux服务器登录名
*/
private final static String SSH_USER = "root";
/**
* linux登陆密码
*/
private final static String SSH_PASSWORD = "123456";
/**
*linux服务器公网IP
*/
private final static String SSH_REMOTE_SERVER = "xxx.xxx.xxx.xxx";
/**
*跳板机ssh开放的接口,ssh通道端口 默认端口 22
*/
private final static int SSH_REMOTE_PORT = 22;
/**
*服务器上数据库端口号
*/
private final static int REMOTE_PORT = 3306;
/**
*这个是本地的端口,选取一个没有占用的port即可
*/
private final static int LOCAL_PORT = 3307;
/**
*要访问的mysql所在的ip
*/
private final static String MYSQL_REMOTE_SERVER = "xxx.xxx.xxx.xxx";

private Session session = null;
/**
* 建立SSH连接
*/
public SSHConnection() throws Throwable{
JSch jsch = new JSch();

session = jsch.getSession(SSH_USER, SSH_REMOTE_SERVER, SSH_REMOTE_PORT);
session.setPassword(SSH_PASSWORD);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
session.setPortForwardingL(LOCAL_PORT, MYSQL_REMOTE_SERVER, REMOTE_PORT);
}
/**
* 断开SSH连接
*/
public void closeSSH (){
this.session.disconnect();
}
}

1.3、java监听类,监听SSH连接情况

创建一个监听类MyContextListener,在 SSH 连接和断开时提供监听和反馈的作用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@WebListener
@Component
public class MyContextListener implements ServletContextListener {
private SSHConnection conexionssh;
public MyContextListener() {
super();
}

@Override
public void contextInitialized(ServletContextEvent arg0) {
// 建立连接
try {
conexionssh = new SSHConnection();
conexionssh.SSHConnection();
System.out.println("成功建立SSH连接!");
} catch (Throwable e) {
System.out.println("SSH连接失败!");
e.printStackTrace();
}
}

@Override
public void contextDestroyed(ServletContextEvent arg0) {
// 断开连接
System.out.println("Context destroyed ... !\n\n\n");
try {
conexionssh.closeSSH(); // disconnect
System.out.println("成功断开SSH连接!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("断开SSH连接出错!");
}
}
}

1.4、编写配置文件

在最后编写 SpringBoot的配置文件,即可运行使用

1
2
3
4
5
6
7
spring.datasource.url=jdbc:mysql://127.0.0.1:3307/数据库名称?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=数据库名
spring.datasource.password=数据库密码
spring.datasource.druid.test-on-borrow=true
spring.datasource.druid.test-while-idle=true
#127.0.0.1:3307 本机的3307端口,不需改动,和ssh工具类的local_port对应起来