From ef299388e071ce75de6623009f21e425b5a3b017 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Mon, 29 Jul 2024 17:46:29 +0800
Subject: [PATCH] 1
---
websocketSerivce/src/main/java/org/example/pojo/User.java | 6
websocketSerivce/pom.xml | 6
websocketSerivce/src/main/java/org/example/pojo/Log.java | 9 +
websocketSerivce/src/main/java/org/example/controller/AdminLogin.java | 22 +-
/dev/null | 89 -----------
websocketSerivce/src/main/java/org/example/pojo/ConfigCurrency.java | 4
websocketSerivce/src/main/java/org/example/util/LoginInterceptor.java | 31 +++
websocketSerivce/src/main/java/org/example/pojo/vo/SaveConfigVo.java | 9 -
websocketSerivce/src/main/java/org/example/util/WebMvcConfig.java | 4
websocketSerivce/src/main/java/org/example/pojo/vo/ConfigCurrencyVo.java | 20 ++
websocketSerivce/src/main/java/org/example/task/MarketDataTask.java | 2
websocketSerivce/src/main/java/org/example/pojo/vo/DeleteConfigVo.java | 20 ++
websocketSerivce/src/main/java/org/example/controller/UserController.java | 103 ++++++++++++
websocketSerivce/src/main/java/org/example/websocket/server/WsServer.java | 32 +++
websocketSerivce/src/main/java/org/example/util/JwtUtil.java | 93 +++++++++++
15 files changed, 323 insertions(+), 127 deletions(-)
diff --git a/websocketSerivce/pom.xml b/websocketSerivce/pom.xml
index 6935c06..ed707c5 100644
--- a/websocketSerivce/pom.xml
+++ b/websocketSerivce/pom.xml
@@ -86,7 +86,11 @@
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
-
+ <dependency>
+ <groupId>com.auth0</groupId>
+ <artifactId>java-jwt</artifactId>
+ <version>3.2.0</version>
+ </dependency>
<!-- Mybatis的场景启动器 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
diff --git a/websocketSerivce/src/main/java/org/example/controller/AdminLogin.java b/websocketSerivce/src/main/java/org/example/controller/AdminLogin.java
index 59fd45c..803fb36 100644
--- a/websocketSerivce/src/main/java/org/example/controller/AdminLogin.java
+++ b/websocketSerivce/src/main/java/org/example/controller/AdminLogin.java
@@ -1,9 +1,11 @@
package org.example.controller;
+import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.example.common.ServerResponse;
import org.example.pojo.User;
import org.example.server.impl.UserServiceImpl;
+import org.example.util.JwtUtil;
import org.example.util.MD5Util;
import org.example.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
@@ -15,6 +17,8 @@
import java.security.SecureRandom;
import java.util.Base64;
import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
/**
* @program: demo
@@ -29,7 +33,7 @@
private UserServiceImpl userService;
@PostMapping("/login")
- public ServerResponse saveUser(@RequestParam("account") int account
+ public ServerResponse saveUser(@RequestParam("account") String account
, @RequestParam("password") String password) {
User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getAccount, account).eq(User::getIsRoot,1));
@@ -40,17 +44,9 @@
if (!MD5Util.verify(password, user.getPassword())) {
return ServerResponse.createBySuccessMsg("密码错误");
}
- String token = generateToken();
- RedisUtil.set(user.getAccount(),token);
- return ServerResponse.createBySuccess(token);
+ String token = JwtUtil.getToken(user);
+ Map<String,String> map = new HashMap<>();
+ map.put("token",token);
+ return ServerResponse.createBySuccess(map);
}
-
- // 生成指定长度的随机 token
- public static String generateToken() {
- SecureRandom secureRandom = new SecureRandom();
- byte[] token = new byte[16];
- secureRandom.nextBytes(token);
- return Base64.getUrlEncoder().withoutPadding().encodeToString(token);
- }
-
}
diff --git a/websocketSerivce/src/main/java/org/example/controller/Login.java b/websocketSerivce/src/main/java/org/example/controller/Login.java
deleted file mode 100644
index 302f805..0000000
--- a/websocketSerivce/src/main/java/org/example/controller/Login.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.example.controller;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import org.example.common.ServerResponse;
-import org.example.dao.LogMapper;
-import org.example.pojo.Log;
-import org.example.pojo.User;
-import org.example.server.UserService;
-import org.example.server.impl.UserServiceImpl;
-import org.example.util.IpAddressUtil;
-import org.example.util.MD5Util;
-import org.example.util.RedisUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.servlet.http.HttpServletRequest;
-import java.security.SecureRandom;
-import java.util.Base64;
-import java.util.Date;
-
-/**
- * @program: demo
- * @description:
- * @create: 2024-07-29 11:17
- **/
-@RestController
-@RequestMapping("/login")
-public class Login {
-
- @Autowired
- private UserServiceImpl userService;
-
- @Autowired
- private LogMapper logMapper;
-
- @PostMapping("/login")
- public ServerResponse saveUser(@RequestParam("account") String account
- , @RequestParam("password") String password, HttpServletRequest request) {
-
- User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getAccount, account));
- if(null == user){
- return ServerResponse.createBySuccessMsg("用户不存在");
- }
-
- if (!MD5Util.verify(password, user.getPassword())) {
- return ServerResponse.createBySuccessMsg("密码错误");
- }
-
- //判断是否锁定
- if(user.getIsLock() == 1){
- return ServerResponse.createBySuccessMsg("账号已被锁定");
- }
-
- //判断是否到期
- if(new Date().after(user.getEndTime())){
- return ServerResponse.createBySuccessMsg("账号已到期");
- }
-
-
- String token = generateToken();
- RedisUtil.set(user.getAccount(),token);
-
- String ip = IpAddressUtil.getIpAddress(request);
- String address = null;
- address = IpAddressUtil.getIpPossessionByFile(ip);
- if(null == address){
- address = IpAddressUtil.getIpAddressByOnline(ip);
- }
- Log log = new Log();
- log.setIp(ip);
- log.setAccount(account);
- log.setLoginTime(new Date());
- log.setAddress(address);
- logMapper.insert(log);
-
- return ServerResponse.createBySuccess(token);
- }
-
- // 生成指定长度的随机 token
- public static String generateToken() {
- SecureRandom secureRandom = new SecureRandom();
- byte[] token = new byte[16];
- secureRandom.nextBytes(token);
- return Base64.getUrlEncoder().withoutPadding().encodeToString(token);
- }
-}
diff --git a/websocketSerivce/src/main/java/org/example/controller/UserController.java b/websocketSerivce/src/main/java/org/example/controller/UserController.java
index e37b31b..4ca9de2 100644
--- a/websocketSerivce/src/main/java/org/example/controller/UserController.java
+++ b/websocketSerivce/src/main/java/org/example/controller/UserController.java
@@ -1,17 +1,32 @@
package org.example.controller;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
import org.example.common.ServerResponse;
import org.example.dao.ConfigCurrencyMapper;
+import org.example.dao.LogMapper;
import org.example.pojo.ConfigCurrency;
+import org.example.pojo.Log;
import org.example.pojo.User;
+import org.example.pojo.vo.DeleteConfigVo;
import org.example.pojo.vo.SaveConfigVo;
import org.example.server.impl.UserServiceImpl;
+import org.example.util.IpAddressUtil;
+import org.example.util.JwtUtil;
import org.example.util.MD5Util;
+import org.example.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.security.SecureRandom;
+import java.sql.Date;
+import java.time.LocalDate;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
/**
* @program: demo
@@ -28,8 +43,65 @@
@Autowired
private UserServiceImpl userService;
+ @Autowired
+ private LogMapper logMapper;
+
+ @PostMapping("/login")
+ public ServerResponse saveUser(@RequestParam("account") String account
+ , @RequestParam("password") String password, HttpServletRequest request) {
+
+ User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getAccount, account).eq(User::getIsRoot,0));
+ if(null == user){
+ return ServerResponse.createBySuccessMsg("用户不存在");
+ }
+
+ if (!MD5Util.verify(password, user.getPassword())) {
+ return ServerResponse.createBySuccessMsg("密码错误");
+ }
+
+ //判断是否锁定
+ if(user.getIsLock() == 1){
+ return ServerResponse.createBySuccessMsg("账号已被锁定");
+ }
+
+ //判断是否到期
+ if(new java.util.Date().after(user.getEndTime())){
+ return ServerResponse.createBySuccessMsg("账号已到期");
+ }
+
+
+ String token = JwtUtil.getToken(user);
+ Map<String,String> map = new HashMap<>();
+ map.put("token",token);
+ String key = "user_";
+ RedisUtil.set(key+user.getId(),token);
+ String ip = IpAddressUtil.getIpAddress(request);
+ String address = null;
+ address = IpAddressUtil.getIpPossessionByFile(ip);
+ if(null == address){
+ address = IpAddressUtil.getIpAddressByOnline(ip);
+ }
+ Log log = new Log();
+ log.setIp(ip);
+ log.setAccount(account);
+ log.setLoginTime(new java.util.Date());
+ log.setAddress(address);
+ logMapper.insert(log);
+
+ return ServerResponse.createBySuccess(map);
+ }
+
+ // 生成指定长度的随机 token
+ public static String generateToken() {
+ SecureRandom secureRandom = new SecureRandom();
+ byte[] token = new byte[16];
+ secureRandom.nextBytes(token);
+ return Base64.getUrlEncoder().withoutPadding().encodeToString(token);
+ }
+
@PostMapping("/saveConfig")
- public ServerResponse saveConfig(SaveConfigVo saveConfigVo) {
+ public ServerResponse saveConfig(@RequestBody SaveConfigVo saveConfigVo) {
+ currencyMapper.delete(new LambdaQueryWrapper<ConfigCurrency>().eq(ConfigCurrency::getUserId,saveConfigVo.getUserId()));
saveConfigVo.getCurrencyList().forEach(f->{
ConfigCurrency currency = new ConfigCurrency();
currency.setUserId(saveConfigVo.getUserId());
@@ -38,11 +110,32 @@
currency.setSell(f.getSell());
currencyMapper.insert(currency);
});
+ List<ConfigCurrency> configCurrencies = currencyMapper.selectList(new LambdaQueryWrapper<ConfigCurrency>().eq(ConfigCurrency::getUserId, saveConfigVo.getUserId()));
+ String key = "config_";
+ Gson gson = new GsonBuilder().setPrettyPrinting().create();
+ String json = gson.toJson(configCurrencies);
+ RedisUtil.set(key+saveConfigVo.getUserId(),json);
+ return ServerResponse.createBySuccess();
+ }
+
+ @PostMapping("/deleteConfig")
+ public ServerResponse deleteConfig(@RequestBody DeleteConfigVo deleteConfigVo) {
+ currencyMapper.deleteBatchIds(deleteConfigVo.getConfigId());
+ List<ConfigCurrency> configCurrencies = currencyMapper.selectList(new LambdaQueryWrapper<ConfigCurrency>().eq(ConfigCurrency::getUserId, deleteConfigVo.getUserId()));
+ String key = "config_";
+ Gson gson = new GsonBuilder().setPrettyPrinting().create();
+ String json = gson.toJson(configCurrencies);
+ RedisUtil.set(key+deleteConfigVo.getUserId(),json);
return ServerResponse.createBySuccess();
}
@PostMapping("/saveUser")
public ServerResponse saveUser(User user) {
+ long count = userService.count(new LambdaQueryWrapper<User>().eq(User::getAccount, user.getAccount()));
+ if(count > 0){
+ return ServerResponse.createByErrorMsg("账号已存在");
+ }
+ user.setAddTime(Date.valueOf(LocalDate.now()));
user.setPassword(MD5Util.encrypt(user.getPassword()));
userService.save(user);
return ServerResponse.createBySuccess();
diff --git a/websocketSerivce/src/main/java/org/example/pojo/ConfigCurrency.java b/websocketSerivce/src/main/java/org/example/pojo/ConfigCurrency.java
index 03a5773..052fbbf 100644
--- a/websocketSerivce/src/main/java/org/example/pojo/ConfigCurrency.java
+++ b/websocketSerivce/src/main/java/org/example/pojo/ConfigCurrency.java
@@ -1,5 +1,7 @@
package org.example.pojo;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import org.example.pojo.vo.SaveConfigVo;
@@ -12,7 +14,7 @@
**/
@Data
public class ConfigCurrency {
-
+ @TableId(type = IdType.AUTO)
private Integer userId;
private String currency;
diff --git a/websocketSerivce/src/main/java/org/example/pojo/Log.java b/websocketSerivce/src/main/java/org/example/pojo/Log.java
index c8bf1c0..01181f4 100644
--- a/websocketSerivce/src/main/java/org/example/pojo/Log.java
+++ b/websocketSerivce/src/main/java/org/example/pojo/Log.java
@@ -1,5 +1,10 @@
package org.example.pojo;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@@ -11,11 +16,13 @@
**/
@Data
public class Log {
-
+ @TableId(type = IdType.AUTO)
private Integer id;
private String account;
+ @TableField(fill = FieldFill.INSERT)
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") //指定格式
private Date loginTime;
private String ip;
diff --git a/websocketSerivce/src/main/java/org/example/pojo/User.java b/websocketSerivce/src/main/java/org/example/pojo/User.java
index a6c3cc9..f2f1f4f 100644
--- a/websocketSerivce/src/main/java/org/example/pojo/User.java
+++ b/websocketSerivce/src/main/java/org/example/pojo/User.java
@@ -1,7 +1,10 @@
package org.example.pojo;
+import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.sql.Date;
@@ -14,10 +17,11 @@
@Data
public class User {
- @TableId(type = IdType.AUTO)
+
/**
* id
*/
+ @TableId(type = IdType.AUTO)
private Integer id;
/**
diff --git a/websocketSerivce/src/main/java/org/example/pojo/vo/ConfigCurrencyVo.java b/websocketSerivce/src/main/java/org/example/pojo/vo/ConfigCurrencyVo.java
new file mode 100644
index 0000000..ea0cd62
--- /dev/null
+++ b/websocketSerivce/src/main/java/org/example/pojo/vo/ConfigCurrencyVo.java
@@ -0,0 +1,20 @@
+package org.example.pojo.vo;
+
+import lombok.Data;
+
+/**
+ * @program: demo
+ * @description:
+ * @create: 2024-07-29 16:48
+ **/
+
+@Data
+public class ConfigCurrencyVo {
+
+ private String currency;
+
+ private String buy;
+
+ private String sell;
+
+}
diff --git a/websocketSerivce/src/main/java/org/example/pojo/vo/DeleteConfigVo.java b/websocketSerivce/src/main/java/org/example/pojo/vo/DeleteConfigVo.java
new file mode 100644
index 0000000..76def3d
--- /dev/null
+++ b/websocketSerivce/src/main/java/org/example/pojo/vo/DeleteConfigVo.java
@@ -0,0 +1,20 @@
+package org.example.pojo.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @program: demo
+ * @description:
+ * @create: 2024-07-29 17:19
+ **/
+@Data
+public class DeleteConfigVo {
+
+
+ private Integer userId;
+
+ private List<String> configId;
+
+}
diff --git a/websocketSerivce/src/main/java/org/example/pojo/vo/SaveConfigVo.java b/websocketSerivce/src/main/java/org/example/pojo/vo/SaveConfigVo.java
index 3f1197b..d8a85a6 100644
--- a/websocketSerivce/src/main/java/org/example/pojo/vo/SaveConfigVo.java
+++ b/websocketSerivce/src/main/java/org/example/pojo/vo/SaveConfigVo.java
@@ -16,13 +16,4 @@
private Integer userId;
private List<ConfigCurrencyVo> currencyList;
-
- @Data
- public class ConfigCurrencyVo{
- private String currency;
-
- private String buy;
-
- private String sell;
- }
}
diff --git a/websocketSerivce/src/main/java/org/example/task/MarketDataTask.java b/websocketSerivce/src/main/java/org/example/task/MarketDataTask.java
index 29100f0..6303a8a 100644
--- a/websocketSerivce/src/main/java/org/example/task/MarketDataTask.java
+++ b/websocketSerivce/src/main/java/org/example/task/MarketDataTask.java
@@ -27,7 +27,7 @@
private final Lock syncCurrencyLock = new ReentrantLock();
- @Scheduled(initialDelay = 0, fixedRate = Long.MAX_VALUE)
+// @Scheduled(initialDelay = 0, fixedRate = Long.MAX_VALUE)
public void start() {
log.info("行情数据计算-------------启动");
diff --git a/websocketSerivce/src/main/java/org/example/util/JwtUtil.java b/websocketSerivce/src/main/java/org/example/util/JwtUtil.java
new file mode 100644
index 0000000..a4e8dc6
--- /dev/null
+++ b/websocketSerivce/src/main/java/org/example/util/JwtUtil.java
@@ -0,0 +1,93 @@
+package org.example.util;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.exceptions.JWTDecodeException;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import lombok.extern.slf4j.Slf4j;
+import org.example.pojo.User;
+
+/**
+ * @program: demo
+ * @description:
+ * @create: 2024-07-29 15:45
+ **/
+@Slf4j
+public class JwtUtil {
+ /**
+ * 使用固定的解密秘钥
+ */
+ private static final String SECRET = "admin";
+
+ /**
+ * @version: V1.0
+ * @description: 生成token并验证token并解密token中的信息
+ * @param: userInfo 用户账号和用户Id
+ * @return: java.lang.String 返回token
+ **/
+ public static String getToken(User userInfo) {
+ try{
+ //用秘钥生成签名
+ Algorithm algorithm = Algorithm.HMAC256(SECRET);
+ //默认头部+载荷(账号/id)+签名=jwt
+ String jwtToken= JWT.create()
+ .withClaim("account", userInfo.getAccount())
+ .withClaim("id", userInfo.getId())
+ .withClaim("isRoot",userInfo.getIsRoot())
+ .sign(algorithm);
+ log.info("用户{}的token生成成功:{}",userInfo.getId(),jwtToken);
+ return jwtToken;
+ }catch (Exception e){
+ log.error("用户{}的token生成异常:{}",userInfo.getId(),e);
+ return null;
+ }
+ }
+
+ /**
+ * @version: V1.0
+ * @description: 校验token是否正确
+ * @param: token
+ * @param: userPhone
+ * @return: UserInfoEntity token中的用户信息(账号/id)
+ **/
+ public static User verify(String token) {
+ try {
+ // 根据用户信息userInfo生成JWT效验器
+ Algorithm algorithm = Algorithm.HMAC256(SECRET);
+ JWTVerifier verifier = JWT.require(algorithm)
+ .build();
+ // 效验TOKEN
+ verifier.verify(token);
+ log.info("token:{}校验成功成功",token);
+ //返回token内容
+ return getTokenInfo(token);
+ } catch (Exception exception) {
+ log.error("token校验异常:{}",exception);
+ return null;
+ }
+ }
+
+ /**
+ * @version: V1.0
+ * @Title: getUsername
+ * @description: 从Token中解密获得Token中的用户信息
+ * @param: token
+ * @return: UserInfoEntity token中的用户信息(账号/id)
+ **/
+ private static User getTokenInfo(String token) {
+ try {
+ DecodedJWT jwt = JWT.decode(token);
+ User userInfo=new User();
+
+ userInfo.setAccount(jwt.getClaim("account").asString());
+ userInfo.setId(jwt.getClaim("id").asInt());
+ userInfo.setIsRoot(jwt.getClaim("isRoot").asInt());
+ log.info("用户{}从token获取用户信息成功",userInfo.getId());
+ return userInfo;
+ } catch (JWTDecodeException e) {
+ log.error("从token:{}获取用户信息异常:{}",token,e);
+ return null;
+ }
+ }
+}
diff --git a/websocketSerivce/src/main/java/org/example/util/LoginInterceptor.java b/websocketSerivce/src/main/java/org/example/util/LoginInterceptor.java
index e69c348..95bf67f 100644
--- a/websocketSerivce/src/main/java/org/example/util/LoginInterceptor.java
+++ b/websocketSerivce/src/main/java/org/example/util/LoginInterceptor.java
@@ -1,5 +1,12 @@
package org.example.util;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.example.pojo.User;
+import org.example.server.UserService;
+import org.example.server.impl.UserServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@@ -12,21 +19,39 @@
* @description:
* @create: 2024-07-29 11:15
**/
+@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
- HttpSession session = request.getSession();
-
// 假设登录状态信息保存在 session 中,这里简单示例,实际项目中可能会有自己的登录状态判断逻辑
- if (session.getAttribute("loggedInUser") != null) {
+ String token = request.getHeader("token");
+ if(null == token){
+ // 未登录,返回未授权错误码或重定向到登录页
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 返回 401 未授权状态码
+ response.setCharacterEncoding("UTF-8");
+ response.getWriter().write("请登录");
+ return false;
+ }
+ User user = JwtUtil.verify(token);
+ if(null == user){
+ // 未登录,返回未授权错误码或重定向到登录页
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 返回 401 未授权状态码
+ response.setCharacterEncoding("UTF-8");
+ response.getWriter().write("请登录");
+ return false;
+ }
+
+ if (user.getIsRoot() == 1) {
// 已登录,允许请求继续
return true;
} else {
// 未登录,返回未授权错误码或重定向到登录页
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 返回 401 未授权状态码
+ response.setCharacterEncoding("UTF-8");
+ response.getWriter().write("请登录");
return false;
}
}
diff --git a/websocketSerivce/src/main/java/org/example/util/WebMvcConfig.java b/websocketSerivce/src/main/java/org/example/util/WebMvcConfig.java
index 13d51c1..e376e31 100644
--- a/websocketSerivce/src/main/java/org/example/util/WebMvcConfig.java
+++ b/websocketSerivce/src/main/java/org/example/util/WebMvcConfig.java
@@ -16,6 +16,8 @@
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**") // 拦截所有请求
- .excludePathPatterns("/login", "/admin/login","/logout"); // 排除登录页和登出操作,防止死循环
+ .excludePathPatterns("/admin/login",
+ "/user/saveConfig",
+ "/user/login");
}
}
\ No newline at end of file
diff --git a/websocketSerivce/src/main/java/org/example/websocket/server/WsServer.java b/websocketSerivce/src/main/java/org/example/websocket/server/WsServer.java
index 530db1e..18e0dcc 100644
--- a/websocketSerivce/src/main/java/org/example/websocket/server/WsServer.java
+++ b/websocketSerivce/src/main/java/org/example/websocket/server/WsServer.java
@@ -1,17 +1,23 @@
package org.example.websocket.server;
import cn.hutool.json.JSONUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
+import org.example.pojo.ConfigCurrency;
import org.example.pojo.MarketDataOut;
import org.example.pojo.bo.WsBo;
+import org.example.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -61,6 +67,11 @@
@OnOpen
public void onOpen(Session session) {
+ WsBo wsBo = getWsBoForSession(session.getId());
+ String s = RedisUtil.get("user_" + wsBo.getUserId());
+ if(null == s || s.isEmpty()){
+ closeSession(session, "用户未登录");
+ }
this.session = session;
int count = onlineCount.incrementAndGet();
wsServers.add(this);
@@ -153,7 +164,7 @@
private Map<Session, Long> lastMessageTimeMap = new ConcurrentHashMap<>();
- private void schedulePushMessage(Session session, String message) {
+ private void schedulePushMessage(Session session, String message) throws JsonProcessingException {
WsBo wsBo = getWsBoForSession(session.getId());
if (wsBo != null) {
long currentTime = System.currentTimeMillis();
@@ -171,8 +182,25 @@
}
}
private static final Gson gson = new Gson();
- private String megFiltration(WsBo wsBo,String message){
+ private String megFiltration(WsBo wsBo,String message) throws JsonProcessingException {
List<MarketDataOut> redisValueMap = gson.fromJson(message, new TypeToken<List<MarketDataOut>>() {}.getType());
+
+ String key = "config_";
+ String value = RedisUtil.get(key + wsBo.getUserId());
+ List<ConfigCurrency> currencies = null;
+ if(null != value && !value.isEmpty()){
+ ObjectMapper objectMapper = new ObjectMapper();
+ currencies = objectMapper.readValue(value, new TypeReference<List<ConfigCurrency>>() {});
+ }
+ if(!CollectionUtils.isEmpty(currencies)){
+ List<String> currency = currencies.stream().map(ConfigCurrency::getCurrency).collect(Collectors.toList());
+ List<String> buy = currencies.stream().map(ConfigCurrency::getBuy).collect(Collectors.toList());
+ List<String> sell = currencies.stream().map(ConfigCurrency::getSell).collect(Collectors.toList());
+ redisValueMap = redisValueMap.stream()
+ .filter(data -> !currency.contains(data.getBaseAsset()) && !buy.contains(data.getBuyingPlatform()) && !sell.contains(data.getSellPlatform()))
+ .collect(Collectors.toList());
+ }
+
//查询币种
if(null != wsBo.getCurrency()){
redisValueMap = redisValueMap.stream()
--
Gitblit v1.9.3