烟_火
人间烟火何不尝
背景:测试环境连接生产环境的数据库,无法本地调试

环境: 
JDK8
Maven:3.6.3
Springboot:2.1.4
jsch:0.1.55

Jsch百度百科介绍:JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。
Jsch Maven依赖包: 
<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

连接配置工具类:

 1 import com.jcraft.jsch.JSch;
 2 import com.jcraft.jsch.Session;
 3 
 4 
 5 import java.util.Properties;
 6 
 7 
 8 /**
 9  * @author dcf
10  * @date 2022-09-23 17:51
11  **/
12 public class SshConnectionTool {
13     //ssh连接的用户名
14     private final static String SSH_USER = “XXX";
15     //ssh连接的密码
16     private final static String SSH_PASSWORD = “****";
17     //ssh远程连接的ip地址
18     private final static String SSH_REMOTE_SERVER = “XXX.XXX.XXX.XXX";
19     //ssh连接的端口号
20     private final static int SSH_REMOTE_PORT = 22;
21     //本地mysql发起连接的数据库IP地址
22     private final static String MYSQL_REMOTE_SERVER = "XXX.XXX.XXX.XXX";
23     //本地数据库连接时用的端口号
24     private final static int LOCAl_PORT = 3310;
25     //远程数据库端口用的端口号
26     private final static int REMOTE_PORT = 3306;
27 
28 
29     private Session sesion; //ssh 会话
30 
31 
32     public void closeSSH ()
33     {
34         sesion.disconnect();
35     }
36 
37 
38     public SshConnectionTool () throws Throwable
39     {
40 
41 
42         JSch jsch = new JSch();
43 
44 
45         sesion = jsch.getSession(SSH_USER, SSH_REMOTE_SERVER, SSH_REMOTE_PORT);
46 
47 
48         sesion.setPassword(SSH_PASSWORD);
49 
50 
51         //设置连接过程不校验known_hosts文件中的信息
52         Properties config = new Properties();
53         config.put("StrictHostKeyChecking", "no");
54         sesion.setConfig(config);
55 
56 
57         sesion.connect(); //ssh 建立连接!
58 
59 
60         //根据安全策略,您必须通过转发端口进行连接
61         sesion.setPortForwardingL(LOCAl_PORT, MYSQL_REMOTE_SERVER, REMOTE_PORT);
62 
63 
64     }
65 }

会话监听类:

 1 import org.springframework.stereotype.Component;
 2 
 3 
 4 import javax.servlet.ServletContextEvent;
 5 import javax.servlet.ServletContextListener;
 6 
 7 
 8 /**
 9  * @author dcf
10  * @date 2022-09-23 17:55
11  **/
12 @Component
13 public class SshContextListener implements ServletContextListener{
14 
15 
16     private SshConnectionTool conexionssh;
17     public SshContextListener() {
18         super();
19     }
20     /**
21      * @see ServletContextListener#contextInitialized(ServletContextEvent)
22      */
23     @Override
24     public void contextInitialized(ServletContextEvent arg0) {
25         System.out.println("Context initialized ... !");
26         try {
27             conexionssh = new SshConnectionTool();
28         } catch (Throwable e) {
29             e.printStackTrace(); // 连接失败
30         }
31     }
32 
33 
34     /**
35      * @see ServletContextListener#contextDestroyed(ServletContextEvent)
36      */
37     @Override
38     public void contextDestroyed(ServletContextEvent arg0) {
39         System.out.println("Context destroyed ... !");
40         conexionssh.closeSSH(); // 断开连接
41     }
42 }

需要连接的mysql地址配置:

1 td-sql:
2   type: com.alibaba.druid.pool.DruidDataSource
3   driverClassName: com.mysql.cj.jdbc.Driver
4   jdbcUrl: jdbc:mysql://127.0.0.1:3310/test?allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai
5   username: name
6   password: password

注:mysql地址配置中的127.0.0.1,其实在连接配置工具类会话方法中默认的,当然里面有多个重载方法,根据不同的重载方法进行不同的配置mysql地址和端口号

 1 public int setPortForwardingL(int lport, String host, int rport) throws JSchException {
 2     return this.setPortForwardingL("127.0.0.1", lport, host, rport);
 3 }
 4 
 5 
 6 public int setPortForwardingL(String bind_address, int lport, String host, int rport) throws JSchException {
 7     return this.setPortForwardingL(bind_address, lport, host, rport, (ServerSocketFactory)null);
 8 }
 9 
10 
11 public int setPortForwardingL(String bind_address, int lport, String host, int rport, ServerSocketFactory ssf) throws JSchException {
12     return this.setPortForwardingL(bind_address, lport, host, rport, ssf, 0);
13 }

 

友好交流,个人公众号:

 

 

 

 

  

posted on 2022-10-11 14:59  段流儿  阅读(1065)  评论(0编辑  收藏  举报