背景:測試環境連接生產環境的資料庫,無法本地調試 環境: JDK8 Maven:3.6.3 Springboot:2.1.4 jsch:0.1.55 Jsch百度百科介紹:JSch 是SSH2的一個純Java實現。它允許你連接到一個sshd 伺服器,使用埠轉發,X11轉發,文件傳輸等等。 Jsch ...
背景:測試環境連接生產環境的資料庫,無法本地調試
環境:
JDK8 Maven:3.6.3 Springboot:2.1.4 jsch:0.1.55Jsch百度百科介紹: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 }
友好交流,個人公眾號: