在 pom 文件中加入相关依赖
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.46</version>
</dependency>
yml 配置,注意端口不要占用已经使用的端口,这个端口只是做转发使用
spring:
data:
mongodb:
uri: mongodb://username:password@127.0.0.1:27019/exam?authSource=admin
mongo:
ssh:
host: 服务器地址
user: 登录账号
password: 密码
port: 22
local-port: 27019(与上面那个配置一样的)
remote-host: mongo 所在的ip地址
remote-port: 27017
代码配置
配置文件类
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnProperty(name = "spring.profiles.active", havingValue = "dev")
@Data
public class SSHMongoConfig {
@Value("${mongo.ssh.host}")
private String host;
@Value("${mongo.ssh.user}")
private String sshUser;
@Value("${mongo.ssh.password}")
private String sshPwd;
@Value("${mongo.ssh.port}")
private int sshPort;
@Value("${mongo.ssh.remote-host}")
private String remoteHost;
@Value("${mongo.ssh.local-port}")
private int localPort;
@Value("${mongo.ssh.remote-port}")
private int remotePort;
}
创建 Mongo session
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class SSHMongoConnection {
Session session = null;
public SSHMongoConnection(String sshUser, String sshPwd, int sshPort, String host, int localPort, int remotePort, String remoteHost) {
try {
JSch jsch = new JSch();
session = jsch.getSession(sshUser, host, sshPort);
session.setPassword(sshPwd);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
session.setPortForwardingL(localPort, remoteHost, remotePort);
} catch (Exception e) {
}
}
public void closeSSH () {
this.session.disconnect();
}
}
建立连接
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
@Component
@Slf4j
public class SSHMongoContextListener implements ServletContextListener {
private SSHMongoConnection conexionssh;
public SSHMongoContextListener() {
super();
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
if(StrUtil.equals(SpringUtil.getActiveProfile(), "prod")) {
log.info("prod 不加载 Mongo SSH 配置");
return ;
}
log.info(SpringUtil.getActiveProfile() + " 开始加载 Mongo SSH 配置");
try {
SSHMongoConfig mongoConfig = SpringUtil.getBean(SSHMongoConfig.class);
conexionssh = new SSHMongoConnection(mongoConfig.getSshUser(), mongoConfig.getSshPwd(), mongoConfig.getSshPort(),
mongoConfig.getHost(), mongoConfig.getLocalPort(), mongoConfig.getRemotePort(), mongoConfig.getRemoteHost());
log.info("成功建立 Mongo SSH 连接!");
} catch (Throwable e) {
log.info("Mongo SSH连接失败!");
e.printStackTrace();
}
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
log.info("Context destroyed ... !");
try {
conexionssh.closeSSH();
log.info("成功断开 Mongo SSH 连接!");
} catch (Exception e) {
e.printStackTrace();
log.info("断开 Mongo SSH 连接出错!");
}
}
}