From 97acfe57e7092f48390d1308e268065a895bd00a Mon Sep 17 00:00:00 2001 From: RockYang Date: Wed, 22 Mar 2023 07:24:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20WebSocket=20=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BD=BF=E7=94=A8=E8=87=AA?= =?UTF-8?q?=E5=B7=B1=E5=AE=9E=E7=8E=B0=E7=9A=84=E7=AE=80=E6=98=93=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/chat_handler.go | 6 ++--- server/server.go | 30 +++++++++++---------- types/config.go | 4 +-- web/.env.development | 2 +- web/.env.production | 4 +-- web/src/utils/http.js | 2 +- web/src/views/Chat.vue | 61 ++++++++++++++++++++++-------------------- 7 files changed, 57 insertions(+), 52 deletions(-) diff --git a/server/chat_handler.go b/server/chat_handler.go index 58640423..a362b8c2 100644 --- a/server/chat_handler.go +++ b/server/chat_handler.go @@ -46,9 +46,9 @@ func (s *Server) ChatHandle(c *gin.Context) { // 将消息发送给 ChatGPT 并获取结果,通过 WebSocket 推送到客户端 func (s *Server) sendMessage(userId string, text string, ws Client) error { var r = types.ApiRequest{ - Model: "gpt-3.5-turbo", - Temperature: 0.9, - MaxTokens: 1024, + Model: s.Config.Chat.Model, + Temperature: s.Config.Chat.Temperature, + MaxTokens: s.Config.Chat.MaxTokens, Stream: true, } var history []types.Message diff --git a/server/server.go b/server/server.go index 12b9cc48..a3fe8c4a 100644 --- a/server/server.go +++ b/server/server.go @@ -117,7 +117,7 @@ func corsMiddleware() gin.HandlerFunc { c.Writer.Header().Set("Access-Control-Allow-Origin", origin) c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE") //允许跨域设置可以返回其他子段,可以自定义字段 - c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, Content-Type, ChatGPT-Token, Session") + c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, Content-Type, ChatGPT-Token") // 允许浏览器(客户端)可以解析的头部 (重要) c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers") //设置缓存时间 @@ -148,19 +148,17 @@ func AuthorizeMiddleware(s *Server) gin.HandlerFunc { return } - tokenName := c.GetHeader("Sec-WebSocket-Protocol") - logger.Info(s.WsSession) - logger.Info(tokenName) - if addr, ok := s.WsSession[tokenName]; ok && addr == c.ClientIP() { - c.Next() - return + tokenName := c.Query("token") + if tokenName == "" { + tokenName = c.GetHeader(types.TokenName) } - - tokenName = c.GetHeader(types.TokenName) - session := sessions.Default(c) - user := session.Get(tokenName) - if user != nil { - c.Set(types.SessionKey, user) + // TODO: 会话过期设置 + if addr, ok := s.WsSession[tokenName]; ok && addr == c.ClientIP() { + session := sessions.Default(c) + user := session.Get(tokenName) + if user != nil { + c.Set(types.SessionKey, user) + } c.Next() } else { c.Abort() @@ -193,11 +191,15 @@ func (s *Server) LoginHandle(c *gin.Context) { sessionId := utils.RandString(42) session := sessions.Default(c) session.Set(sessionId, token) + err = session.Save() + if err != nil { + logger.Error("Error for save session: ", err) + } // 记录客户端 IP 地址 s.WsSession[sessionId] = c.ClientIP() c.JSON(http.StatusOK, types.BizVo{Code: types.Success, Data: sessionId}) } func Hello(c *gin.Context) { - c.JSON(http.StatusOK, gin.H{"code": 0, "message": fmt.Sprintf("HELLO, XWEBSSH !!!")}) + c.JSON(http.StatusOK, gin.H{"code": 0, "message": fmt.Sprintf("HELLO, ChatGPT !!!")}) } diff --git a/types/config.go b/types/config.go index decad5ea..3837eb91 100644 --- a/types/config.go +++ b/types/config.go @@ -50,9 +50,9 @@ func NewDefaultConfig() *Config { Domain: "", Path: "/", MaxAge: 86400, - Secure: false, + Secure: true, HttpOnly: false, - SameSite: http.SameSiteLaxMode, + SameSite: http.SameSiteNoneMode, }, Chat: Chat{ ApiURL: "https://api.openai.com/v1/chat/completions", diff --git a/web/.env.development b/web/.env.development index 3ea203f8..ceae57d5 100644 --- a/web/.env.development +++ b/web/.env.development @@ -1,2 +1,2 @@ -VUE_APP_API_HOST=172.22.11.200:5678 +VUE_APP_API_HOST=127.0.0.1:5678 VUE_APP_API_SECURE=false \ No newline at end of file diff --git a/web/.env.production b/web/.env.production index d2ac3b7d..3ea203f8 100644 --- a/web/.env.production +++ b/web/.env.production @@ -1,2 +1,2 @@ -VUE_APP_WS_HOST=ws://127.0.0.1:5678 -VUE_APP_API_SECURE=false +VUE_APP_API_HOST=172.22.11.200:5678 +VUE_APP_API_SECURE=false \ No newline at end of file diff --git a/web/src/utils/http.js b/web/src/utils/http.js index bb77c3a8..6ce15291 100644 --- a/web/src/utils/http.js +++ b/web/src/utils/http.js @@ -3,7 +3,7 @@ import {getSessionId} from "@/utils/storage"; axios.defaults.timeout = 5000 axios.defaults.baseURL = process.env.VUE_APP_API_SECURE === true ? 'https://' + process.env.VUE_APP_API_HOST : 'http://' + process.env.VUE_APP_API_HOST -axios.defaults.withCredentials = true +axios.defaults.withCredentials = true; axios.defaults.headers.post['Content-Type'] = 'application/json' // HTTP拦截器 diff --git a/web/src/views/Chat.vue b/web/src/views/Chat.vue index 16550542..21860d4e 100644 --- a/web/src/views/Chat.vue +++ b/web/src/views/Chat.vue @@ -111,12 +111,7 @@ export default defineComponent({ this.chatBoxHeight = window.innerHeight - this.toolBoxHeight; }) - // 获取会话 - httpPost("/api/session/get").then(() => { - this.connect(); - }).catch(() => { - this.showLoginDialog = true; - }) + this.checkSession(); for (let i = 0; i < 10; i++) { this.chatData.push({ @@ -139,14 +134,38 @@ export default defineComponent({ }, methods: { - connect: function () { - if (this.online) { - return - } + // 检查会话 + checkSession: function () { + httpPost("/api/session/get").then(() => { + this.connect(); + }).catch((res) => { + if (res.code === 400) { + this.showLoginDialog = true; + } else { + this.connectingMessageBox = ElMessageBox.confirm( + '^_^ 会话发生异常,您已经从服务器断开连接!', + '注意:', + { + confirmButtonText: '重连会话', + cancelButtonText: '不聊了', + type: 'warning', + } + ).then(() => { + this.connect(); + }).catch(() => { + ElMessage({ + type: 'info', + message: '您关闭了会话', + }) + }) + } + }) + }, + connect: function () { // 初始化 WebSocket 对象 const token = getSessionId(); - const socket = new WebSocket('ws://' + process.env.VUE_APP_API_HOST + '/api/chat', [token]); + const socket = new WebSocket('ws://' + process.env.VUE_APP_API_HOST + '/api/chat?token=' + token); socket.addEventListener('open', () => { ElMessage.success('创建会话成功!'); @@ -193,24 +212,8 @@ export default defineComponent({ }); socket.addEventListener('close', () => { - ElMessageBox.confirm( - '^_^ 会话发生异常,您已经从服务器断开连接!', - '注意:', - { - confirmButtonText: '重连会话', - cancelButtonText: '不聊了', - type: 'warning', - } - ) - .then(() => { - this.connect(); - }) - .catch(() => { - ElMessage({ - type: 'info', - message: '您关闭了会话', - }) - }) + // 检查会话,自动登录 + this.checkSession(); }); this.socket = socket;