前言
:近期有个小实验,课程作业吧,要实现一个浏览器终端连接服务器,同时也能连接docker容器,于是开始查资料,由于自己之前也没有这方面的经验,而且好多博客讲不清反而会误导自己的思路,才想起自己写一篇博客来分享一下
注:我参考了一些博客,现在链接找不到就没去刻意搜索挂上来了
**注重思路,想着直接复制运行就......,实验课作业,漏洞很多**
服务端
这里以websocket
保持状态进行前后端交互,不懂的可以自行百度了解一下它和普通http协议的区别。
1、导入Maven依赖
<!-- Web相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- jsch支持 -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
<!-- WebSocket 支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.27</version>
</dependency>
<dependency>
<groupId>com.spotify</groupId>
<artifactId>docker-client</artifactId>
<version>8.16.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
2、配置config
配置拦截器和处理器
由于SocketHandler
处理器当中的处理逻辑交给spring容器管理,这里采用注入的方式引入,通过new
引入会找不到对象报错
IP:Port/stomp/websocketJS
时前端发送请求建立 Webscoket 连接的地址(是啥为所谓,后面对应上了就行)
@Configuration
@EnableWebSocket
public class WebSshConfig implements WebSocketConfigurer {
@Autowired
private SocketHandler socketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(socketHandler, "/stomp/websocketJS")
.addInterceptors(new WebSocketHandshakeInterceptor())
.setAllowedOriginPatterns("*")
.withSockJS();
}
}
3、拦截器
会存在一些跨越看不懂,因为我这是写完了代码再来写的博客,还是那句话,这东西不难,
注重理解才能举一反三
public class WebSocketHandshakeInterceptor extends HttpSessionHandshakeInterceptor {
private final Logger logger = LoggerFactory.getLogger(WebSocketHandshakeInterceptor.class);
@Override
public boolean beforeHandshake(ServerHttpRequest request,
ServerHttpResponse response,
WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
// websocket握手建立前调用,获取httpsession
if(request instanceof ServletServerHttpRequest) {
ServletServerHttpRequest servlet = (ServletServerHttpRequest) request;
// 这里从request中获取session,获取不到不创建,可以根据业务处理此段
HttpSession httpSession = servlet.getServletRequest().getSession();
logger.info