业务场景
处于对安全角度的考虑并且服务器不在同一个局域网下,服务器的访问地址不适合直接放到公网上,需要本地服务器通过ssh信道转发到远程服务器中。springboot单体项目连接服务器。
解决方法
引入依赖
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.53</version>
</dependency>
账号密码验证连接SSH
SSH连接工具类
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.util.Properties;
/**
* SSH连接远程服务器转发工具类
*/
public class SshConnectionTool {
//ssh连接的用户名
private final static String SSH_USER = "test";
//ssh连接的密码
private final static String SSH_PASSWORD = "123456";
//ssh远程连接的ip地址
private final static String SSH_REMOTE_SERVER = "12.34.56.78";
//ssh连接的端口号
private final static int SSH_REMOTE_PORT = 2721;
//远程mysql连接的IP地址
private final static String MYSQL_REMOTE_SERVER = "124.543.789.111";
//本地数据库连接时用的端口号,和yml配置的端口一致
private final static int LOCAl_PORT = 3309;
//远程数据库端口用的端口号
private final static int REMOTE_PORT = 31494;
private Session sesion; //ssh 会话
public void closeSSH ()
{
sesion.disconnect();
}
public SshConnectionTool () throws Throwable
{
JSch jsch = new JSch();
sesion = jsch.getSession(SSH_USER, SSH_REMOTE_SERVER, SSH_REMOTE_PORT);
sesion.setPassword(SSH_PASSWORD);
//设置连接过程不校验known_hosts文件中的信息
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
sesion.setConfig(config);
sesion.connect(); //ssh 建立连接!
//根据安全策略,您必须通过转发端口进行连接
sesion.setPortForwardingL(LOCAl_PORT, MYSQL_REMOTE_SERVER, REMOTE_PORT);
}
}
SSH连接监视器
import org.springframework.stereotype.Component;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* SSH链接 监视器
*/
@Component
public class SshContextListener implements ServletContextListener {
private SshConnectionTool conexionssh;
public SshContextListener() {
super();
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("Context initialized ... !");
try {
conexionssh = new SshConnectionTool();
} catch (Throwable e) {
e.printStackTrace(); // 连接失败
}
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("Context destroyed ... !");
conexionssh.closeSSH(); // 断开连接
}
}
yml 连接池配置
url: jdbc:mysql://127.0.0.1:3309/test?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource