使用纯Java实现一个WebSSH项目的示例代码

2020-03-13 18:02:03王冬梅

需要注意的是,我在拦截器中加入的用户标识是使用了 随机的UUID ,这是因为作为一个独立的websocket项目,没有用户模块,如果需要将这个项目集成到自己的项目中,需要修改这部分代码,将其改为自己项目中识别一个用户所用的用户标识。

WebSSH的业务逻辑实现(核心)

刚才我们实现了websocket的配置,都是一些死代码,实现了接口再根据自身需求即可实现,现在我们将进行后端主要业务逻辑的实现,在实现这个逻辑之前,我们先来想想,WebSSH,我们主要想要呈现一个什么效果。

我这里做了一个总结:

1.首先我们得先连接上终端(初始化连接)
2.其次我们的服务端需要处理来自前端的消息(接收并处理前端消息)
3.我们需要将终端返回的消息回写到前端(数据回写前端)
4.关闭连接

根据这四个需求,我们先定义一个接口,这样可以让需求明了起来。

/**
 * @Description: WebSSH的业务逻辑
 * @Author: NoCortY
 * @Date: 2020/3/7
 */
public interface WebSSHService {
 /**
 * @Description: 初始化ssh连接
 * @Param:
 * @return:
 * @Author: NoCortY
 * @Date: 2020/3/7
 */
 public void initConnection(WebSocketSession session);

 /**
 * @Description: 处理客户段发的数据
 * @Param:
 * @return:
 * @Author: NoCortY
 * @Date: 2020/3/7
 */
 public void recvHandle(String buffer, WebSocketSession session);

 /**
 * @Description: 数据写回前端 for websocket
 * @Param:
 * @return:
 * @Author: NoCortY
 * @Date: 2020/3/7
 */
 public void sendMessage(WebSocketSession session, byte[] buffer) throws IOException;

 /**
 * @Description: 关闭连接
 * @Param:
 * @return:
 * @Author: NoCortY
 * @Date: 2020/3/7
 */
 public void close(WebSocketSession session);
}

现在我们可以根据这个接口去实现我们定义的功能了。

初始化连接

由于我们的底层是依赖jsch实现的,所以这里是需要使用jsch去建立连接的。而所谓初始化连接,实际上就是将我们所需要的连接信息,保存在一个Map中,这里并不进行任何的真实连接操作。为什么这里不直接进行连接?因为这里前端只是连接上了WebSocket,但是我们还需要前端给我们发来linux终端的用户名和密码,没有这些信息,我们是无法进行连接的。

public void initConnection(WebSocketSession session) {
 JSch jSch = new JSch();
 SSHConnectInfo sshConnectInfo = new SSHConnectInfo();
 sshConnectInfo.setjSch(jSch);
 sshConnectInfo.setWebSocketSession(session);
 String uuid = String.valueOf(session.getAttributes().get(ConstantPool.USER_UUID_KEY));
 //将这个ssh连接信息放入map中
 sshMap.put(uuid, sshConnectInfo);
}

处理客户端发送的数据

在这一步骤中,我们会分为两个分支。

第一个分支:如果客户端发来的是终端的用户名和密码等信息,那么我们进行终端的连接。