Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Kwan的解忧杂货铺@新空间代码工作室
SpringBoot-kwan
提交
e6fc12cd
S
SpringBoot-kwan
项目概览
Kwan的解忧杂货铺@新空间代码工作室
/
SpringBoot-kwan
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
SpringBoot-kwan
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
e6fc12cd
编写于
8月 26, 2023
作者:
Kwan的解忧杂货铺@新空间代码工作室
🐭
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix:添加websocket
上级
7e230f58
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
327 addition
and
2 deletion
+327
-2
pom.xml
pom.xml
+10
-0
src/main/java/com/kwan/springbootkwan/aop/LogAspect.java
src/main/java/com/kwan/springbootkwan/aop/LogAspect.java
+3
-1
src/main/java/com/kwan/springbootkwan/config/WebSocketConfig.java
.../java/com/kwan/springbootkwan/config/WebSocketConfig.java
+21
-0
src/main/java/com/kwan/springbootkwan/controller/SystemController.java
.../com/kwan/springbootkwan/controller/SystemController.java
+40
-0
src/main/java/com/kwan/springbootkwan/service/WebSocketServer.java
...java/com/kwan/springbootkwan/service/WebSocketServer.java
+133
-0
src/main/resources/application-local.yml
src/main/resources/application-local.yml
+5
-1
src/main/resources/index.html
src/main/resources/index.html
+74
-0
src/test/java/com/kwan/springbootkwan/utils/StringEncryptorUtil.java
...va/com/kwan/springbootkwan/utils/StringEncryptorUtil.java
+41
-0
未找到文件。
pom.xml
浏览文件 @
e6fc12cd
...
@@ -211,6 +211,16 @@
...
@@ -211,6 +211,16 @@
<artifactId>
springfox-swagger-ui
</artifactId>
<artifactId>
springfox-swagger-ui
</artifactId>
<version>
${swagger.version}
</version>
<version>
${swagger.version}
</version>
</dependency>
</dependency>
<dependency>
<groupId>
com.github.ulisesbocchio
</groupId>
<artifactId>
jasypt-spring-boot-starter
</artifactId>
<version>
2.1.0
</version>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-websocket
</artifactId>
<version>
2.6.6
</version>
</dependency>
</dependencies>
</dependencies>
<build>
<build>
<plugins>
<plugins>
...
...
src/main/java/com/kwan/springbootkwan/aop/LogAspect.java
浏览文件 @
e6fc12cd
...
@@ -17,7 +17,9 @@ import org.springframework.stereotype.Component;
...
@@ -17,7 +17,9 @@ import org.springframework.stereotype.Component;
@Aspect
@Aspect
@Slf4j
@Slf4j
public
class
LogAspect
{
public
class
LogAspect
{
@Pointcut
(
value
=
"execution(* com.kwan.springbootkwan.service.*.*(..))"
)
@Pointcut
(
value
=
"execution(* com.kwan.springbootkwan.service.*.*(..)) && !execution(* com.kwan.springbootkwan.service.WebSocketServer.*(..))"
)
public
void
pcl
()
{
public
void
pcl
()
{
}
}
...
...
src/main/java/com/kwan/springbootkwan/config/WebSocketConfig.java
0 → 100644
浏览文件 @
e6fc12cd
package
com.kwan.springbootkwan.config
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.web.socket.server.standard.ServerEndpointExporter
;
/**
* 开启websocket的支持
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/8/26 16:45
*/
@Configuration
public
class
WebSocketConfig
{
@Bean
public
ServerEndpointExporter
serverEndpointExporter
()
{
return
new
ServerEndpointExporter
();
}
}
\ No newline at end of file
src/main/java/com/kwan/springbootkwan/controller/SystemController.java
0 → 100644
浏览文件 @
e6fc12cd
package
com.kwan.springbootkwan.controller
;
import
com.kwan.springbootkwan.service.WebSocketServer
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.ResponseBody
;
import
org.springframework.web.servlet.ModelAndView
;
import
java.io.IOException
;
import
java.util.HashMap
;
import
java.util.Map
;
@Controller
(
"web_Scoket_system"
)
@RequestMapping
(
"/api/socket"
)
public
class
SystemController
{
//页面请求
@GetMapping
(
"/index/{userId}"
)
public
ModelAndView
socket
(
@PathVariable
String
userId
)
{
ModelAndView
mav
=
new
ModelAndView
(
"/socket1"
);
mav
.
addObject
(
"userId"
,
userId
);
return
mav
;
}
//推送数据接口
@ResponseBody
@RequestMapping
(
"/socket/push/{cid}"
)
public
Map
pushToWeb
(
@PathVariable
String
cid
,
String
message
)
{
Map
<
String
,
Object
>
result
=
new
HashMap
<>();
try
{
WebSocketServer
.
sendInfo
(
message
,
cid
);
result
.
put
(
"code"
,
cid
);
result
.
put
(
"msg"
,
message
);
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
return
result
;
}
}
src/main/java/com/kwan/springbootkwan/service/WebSocketServer.java
0 → 100644
浏览文件 @
e6fc12cd
package
com.kwan.springbootkwan.service
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Component
;
import
javax.websocket.OnClose
;
import
javax.websocket.OnError
;
import
javax.websocket.OnMessage
;
import
javax.websocket.OnOpen
;
import
javax.websocket.Session
;
import
javax.websocket.server.PathParam
;
import
javax.websocket.server.ServerEndpoint
;
import
java.io.IOException
;
import
java.util.concurrent.CopyOnWriteArraySet
;
@Component
@Slf4j
@ServerEndpoint
(
value
=
"/api/websocket/{sid}"
)
public
class
WebSocketServer
{
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private
static
int
onlineCount
=
0
;
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
private
static
CopyOnWriteArraySet
<
WebSocketServer
>
webSocketSet
=
new
CopyOnWriteArraySet
<>();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private
Session
session
;
//接收sid
private
String
sid
=
""
;
/**
* 连接建立成功调用的方法
*/
@OnOpen
public
void
onOpen
(
Session
session
,
@PathParam
(
"sid"
)
String
sid
)
{
this
.
session
=
session
;
webSocketSet
.
add
(
this
);
//加入set中
this
.
sid
=
sid
;
addOnlineCount
();
//在线数加1
try
{
sendMessage
(
"conn_success"
);
log
.
info
(
"有新窗口开始监听:"
+
sid
+
",当前在线人数为:"
+
getOnlineCount
());
}
catch
(
IOException
e
)
{
log
.
error
(
"websocket IO Exception"
);
}
}
/**
* 连接关闭调用的方法
*/
@OnClose
public
void
onClose
()
{
webSocketSet
.
remove
(
this
);
//从set中删除
subOnlineCount
();
//在线数减1
//断开连接情况下,更新主板占用情况为释放
log
.
info
(
"释放的sid为:"
+
sid
);
//这里写你 释放的时候,要处理的业务
log
.
info
(
"有一连接关闭!当前在线人数为"
+
getOnlineCount
());
}
/**
* 收到客户端消息后调用的方法
*
* @ Param message 客户端发送过来的消息
*/
@OnMessage
public
void
onMessage
(
String
message
,
Session
session
)
{
log
.
info
(
"收到来自窗口"
+
sid
+
"的信息:"
+
message
);
//群发消息
for
(
WebSocketServer
item
:
webSocketSet
)
{
try
{
item
.
sendMessage
(
message
);
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
}
/**
* @ Param session
* @ Param error
*/
@OnError
public
void
onError
(
Session
session
,
Throwable
error
)
{
log
.
error
(
"发生错误"
);
error
.
printStackTrace
();
}
/**
* 实现服务器主动推送
*/
public
void
sendMessage
(
String
message
)
throws
IOException
{
this
.
session
.
getBasicRemote
().
sendText
(
message
);
}
/**
* 群发自定义消息
*/
public
static
void
sendInfo
(
String
message
,
@PathParam
(
"sid"
)
String
sid
)
throws
IOException
{
log
.
info
(
"推送消息到窗口"
+
sid
+
",推送内容:"
+
message
);
for
(
WebSocketServer
item
:
webSocketSet
)
{
try
{
//这里可以设定只推送给这个sid的,为null则全部推送
if
(
sid
==
null
)
{
// item.sendMessage(message);
}
else
if
(
item
.
sid
.
equals
(
sid
))
{
item
.
sendMessage
(
message
);
}
}
catch
(
IOException
e
)
{
continue
;
}
}
}
public
static
synchronized
int
getOnlineCount
()
{
return
onlineCount
;
}
public
static
synchronized
void
addOnlineCount
()
{
WebSocketServer
.
onlineCount
++;
}
public
static
synchronized
void
subOnlineCount
()
{
WebSocketServer
.
onlineCount
--;
}
public
static
CopyOnWriteArraySet
<
WebSocketServer
>
getWebSocketSet
()
{
return
webSocketSet
;
}
}
src/main/resources/application-local.yml
浏览文件 @
e6fc12cd
...
@@ -41,4 +41,8 @@ spring:
...
@@ -41,4 +41,8 @@ spring:
driver-class-name
:
com.mysql.cj.jdbc.Driver
driver-class-name
:
com.mysql.cj.jdbc.Driver
url
:
jdbc:mysql://120.79.36.53:3306/kwan?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
url
:
jdbc:mysql://120.79.36.53:3306/kwan?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username
:
root
username
:
root
password
:
15671628341Qwe.
password
:
15671628341Qwe.
\ No newline at end of file
# jasypt加密的密匙
jasypt
:
encryptor
:
password
:
Y6M9fAJQdU7jNp5MW
\ No newline at end of file
src/main/resources/index.html
0 → 100644
浏览文件 @
e6fc12cd
<!DOCTYPE html>
<html>
<head>
<meta
charset=
"utf-8"
>
<title>
Java后端WebSocket的Tomcat实现
</title>
<script
type=
"text/javascript"
src=
"js/jquery.min.js"
></script>
</head>
<body>
<div
id=
"main"
style=
"width: 1200px;height:800px;"
></div>
Welcome
<br/><input
id=
"text"
type=
"text"
/>
<button
onclick=
"send()"
>
发送消息
</button>
<hr/>
<button
onclick=
"closeWebSocket()"
>
关闭WebSocket连接
</button>
<hr/>
<div
id=
"message"
></div>
</body>
<script
type=
"text/javascript"
>
var
websocket
=
null
;
//判断当前浏览器是否支持WebSocket
if
(
'
WebSocket
'
in
window
)
{
//改成你的地址
websocket
=
new
WebSocket
(
"
ws://localhost:8888/api/websocket/100
"
);
}
else
{
alert
(
'
当前浏览器 Not support websocket
'
)
}
//连接发生错误的回调方法
websocket
.
onerror
=
function
()
{
setMessageInnerHTML
(
"
WebSocket连接发生错误
"
);
};
//连接成功建立的回调方法
websocket
.
onopen
=
function
()
{
setMessageInnerHTML
(
"
WebSocket连接成功
"
);
}
var
U01data
,
Uidata
,
Usdata
//接收到消息的回调方法
websocket
.
onmessage
=
function
(
event
)
{
console
.
log
(
event
);
setMessageInnerHTML
(
event
);
setechart
()
}
//连接关闭的回调方法
websocket
.
onclose
=
function
()
{
setMessageInnerHTML
(
"
WebSocket连接关闭
"
);
}
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window
.
onbeforeunload
=
function
()
{
closeWebSocket
();
}
//将消息显示在网页上
function
setMessageInnerHTML
(
innerHTML
)
{
document
.
getElementById
(
'
message
'
).
innerHTML
+=
innerHTML
+
'
<br/>
'
;
}
//关闭WebSocket连接
function
closeWebSocket
()
{
websocket
.
close
();
}
//发送消息
function
send
()
{
var
message
=
document
.
getElementById
(
'
text
'
).
value
;
websocket
.
send
(
'
{"msg":"
'
+
message
+
'
"}
'
);
setMessageInnerHTML
(
message
+
"
"
);
}
</script>
</html>
\ No newline at end of file
src/test/java/com/kwan/springbootkwan/utils/StringEncryptorUtil.java
0 → 100644
浏览文件 @
e6fc12cd
package
com.kwan.springbootkwan.utils
;
import
com.kwan.springbootkwan.SpringBootKwanApplication
;
import
org.jasypt.encryption.StringEncryptor
;
import
org.junit.Assert
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.test.context.ContextConfiguration
;
import
org.springframework.test.context.junit4.SpringRunner
;
/**
* 加解密工具测试
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/8/26 15:49
*/
@RunWith
(
SpringRunner
.
class
)
@SpringBootTest
@ContextConfiguration
(
classes
=
SpringBootKwanApplication
.
class
)
public
class
StringEncryptorUtil
{
@Autowired
private
StringEncryptor
encryptor
;
@Test
public
void
getPass
()
{
String
url
=
encryptor
.
encrypt
(
"jdbc:mysql://localhost:3306/mydb?autoReconnect=true&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8"
);
String
name
=
encryptor
.
encrypt
(
"root"
);
String
password
=
encryptor
.
encrypt
(
"123456"
);
System
.
out
.
println
(
"database url: "
+
url
);
System
.
out
.
println
(
"database name: "
+
name
);
System
.
out
.
println
(
"database password: "
+
password
);
Assert
.
assertTrue
(
url
.
length
()
>
0
);
Assert
.
assertTrue
(
name
.
length
()
>
0
);
Assert
.
assertTrue
(
password
.
length
()
>
0
);
}
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录