From 704681ef2f0f777f40b45ed2ef6dd5d6d94505b1 Mon Sep 17 00:00:00 2001 From: xlj Date: Tue, 3 Mar 2026 09:33:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E4=BD=93=E5=8C=96=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E6=9C=8D=E5=8A=A1=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/tobacco/mp/config/CorsFilter.java | 4 +- .../com/tobacco/mp/config/RedisConfig.java | 11 ++-- .../tobacco/mp/config/RequestInterceptor.java | 41 ++++++++++++- .../com/tobacco/mp/config/ServerRunner.java | 2 +- .../com/tobacco/mp/config/WebMvcConfig.java | 16 ++--- .../mp/controller/PlatformController.java | 8 +++ .../com/tobacco/mp/utils/AnnotationUtil.java | 1 + .../com/tobacco/mp/utils/SpringBeanUtils.java | 58 +++++++++++++++++++ 8 files changed, 123 insertions(+), 18 deletions(-) create mode 100644 cdaxxt-common/src/main/java/com/tobacco/mp/utils/SpringBeanUtils.java diff --git a/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/CorsFilter.java b/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/CorsFilter.java index 352a116..e6cfbca 100644 --- a/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/CorsFilter.java +++ b/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/CorsFilter.java @@ -2,7 +2,6 @@ package com.tobacco.mp.config; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; - import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -15,8 +14,7 @@ import java.io.IOException; public class CorsFilter implements Filter { @Override - public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) - throws IOException, ServletException { + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; HttpServletRequest request = (HttpServletRequest) req; String origin = request.getHeader("Origin"); diff --git a/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/RedisConfig.java b/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/RedisConfig.java index 49ca6a7..3e8d6ad 100644 --- a/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/RedisConfig.java +++ b/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/RedisConfig.java @@ -28,22 +28,23 @@ public class RedisConfig extends CachingConfigurerSupport { public RedisTemplate redisTemplate(RedisConnectionFactory factory) { RedisTemplate template = new RedisTemplate<>(); + // 配置连接工厂 template.setConnectionFactory(factory); - - //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) + // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); - // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public + // 指定要序列化的域,field,get和set,以及修饰符范围 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 + // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + jacksonSeial.setObjectMapper(om); // 值采用json序列化 template.setValueSerializer(jacksonSeial); - //使用StringRedisSerializer来序列化和反序列化redis的key值 + // 使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); // 设置hash key 和value序列化模式 diff --git a/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/RequestInterceptor.java b/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/RequestInterceptor.java index 45fc787..e89e2e9 100644 --- a/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/RequestInterceptor.java +++ b/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/RequestInterceptor.java @@ -1,7 +1,11 @@ package com.tobacco.mp.config; +import com.tobacco.mp.constant.Constant; +import com.tobacco.mp.constant.Symbol; +import com.tobacco.mp.utils.RedisUtils; +import com.tobacco.mp.utils.SpringBeanUtils; +import com.tobacco.mp.utils.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -13,7 +17,42 @@ public class RequestInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 请求拦截处理 + String api = request.getServletPath(); + // 开放接口的秘钥验证(当检测到请求头携带指定字段意味着该接口为开放接口需验证) + String secretKey = request.getHeader("SecretKey"); + if (StringUtils.isNotEmpty(secretKey)) { + return verifyOpenApi(secretKey, api); + } + // 处理其他非开放接口的校验,判断是否拦截 + return true; } + /** + * 验证开放的接口 + * @param secretKey 秘钥 + * @param api 接口 + * @return 是否允许请求 + */ + public boolean verifyOpenApi(String secretKey, String api) { + // 验证请求的合法性 + String verifyCode = "This is a secretKey"; + if (!verifyCode.equals(secretKey)) { + return false; + } + // 验证接口是否是开放接口 + RedisUtils redisUtils = SpringBeanUtils.getBean(RedisUtils.class); + Object o = redisUtils.get(Constant.OPEN_API); + if (o != null) { + String apiStr = String.valueOf(o); + String[] array = apiStr.split(Symbol.COMMA); + for (String s : array) { + if (s.equals(api)) { + return true; + } + } + } + return false; + } + } diff --git a/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/ServerRunner.java b/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/ServerRunner.java index 4bd30ad..ea29b1e 100644 --- a/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/ServerRunner.java +++ b/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/ServerRunner.java @@ -12,7 +12,7 @@ public class ServerRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { - // 服务器成功启动加载其他 + // 服务器成功启动后加载其他 } diff --git a/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/WebMvcConfig.java b/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/WebMvcConfig.java index 5001d8c..ac1cac4 100644 --- a/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/WebMvcConfig.java +++ b/cdaxxt-bootstrap/src/main/java/com/tobacco/mp/config/WebMvcConfig.java @@ -1,9 +1,11 @@ package com.tobacco.mp.config; +import com.tobacco.mp.utils.AnnotationUtil; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import javax.annotation.Resource; /** * 资源管理配置 @@ -11,12 +13,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebMvcConfig implements WebMvcConfigurer { - /** - * 声明需要放行的swagger资源路径 - */ - private String[] newPassPath = new String[]{"/login", "/swagger-ui.html/**", "/v2/**","/files/**", "/webjars/**", "/swagger-resources/**", - "/**.js", "/static/**", "/images/**", "/index.html", "/css/**", "/js/**", "/file/**"}; - + @Resource + AnnotationUtil annotationUtil; /** * 添加资源站点 @@ -24,7 +22,7 @@ public class WebMvcConfig implements WebMvcConfigurer { */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { - + // 指定资源映射 } /** @@ -33,8 +31,10 @@ public class WebMvcConfig implements WebMvcConfigurer { */ @Override public void addInterceptors(InterceptorRegistry registry) { + // 加载自定义注解 + annotationUtil.loadCustomAnnotation(); // 注册拦截器 - registry.addInterceptor(new RequestInterceptor()).addPathPatterns("/**").excludePathPatterns(newPassPath); + registry.addInterceptor(new RequestInterceptor()).addPathPatterns("/**").excludePathPatterns(AnnotationUtil.PASS_API); } } diff --git a/cdaxxt-business/src/main/java/com/tobacco/mp/controller/PlatformController.java b/cdaxxt-business/src/main/java/com/tobacco/mp/controller/PlatformController.java index 6e5b672..f229efe 100644 --- a/cdaxxt-business/src/main/java/com/tobacco/mp/controller/PlatformController.java +++ b/cdaxxt-business/src/main/java/com/tobacco/mp/controller/PlatformController.java @@ -1,6 +1,7 @@ package com.tobacco.mp.controller; import com.alibaba.fastjson.JSONObject; +import com.tobacco.mp.annotation.PassOperation; import com.tobacco.mp.dto.PlatformMessageDTO; import com.tobacco.mp.dto.PlatformNoticeDTO; import com.tobacco.mp.dto.PlatformTaskDTO; @@ -28,6 +29,7 @@ public class PlatformController { PlatformMessageService messageService; // 查询一体化平台的用户列表 + @PassOperation @GetMapping(value = "/getUserList") public ResponseResult getUserList() { userService.getUserList(); @@ -35,18 +37,21 @@ public class PlatformController { } // 查询一体化平台的用户ID + @PassOperation @GetMapping(value = "/getUserIdByAccount") public ResponseResult getUserIdByAccount(@RequestParam String loginName) { return ResponseResult.success(userService.getUserIdByAccount(loginName)); } // 一体化平台身份令牌认证 + @PassOperation @GetMapping(value = "/tokenAccess") public ResponseResult tokenAccess(@RequestParam String token) { return ResponseResult.success(userService.tokenAccess(token)); } // 向一体化平台发送消息 + @PassOperation @PostMapping(value = "/sendMessage") public ResponseResult sendMessage(@RequestBody PlatformMessageDTO dataDTO) { messageService.sendMessage(dataDTO); @@ -54,6 +59,7 @@ public class PlatformController { } // 向一体化平台发送通知/公告 + @PassOperation @PostMapping(value = "/sendNotice") public ResponseResult sendNotice(@RequestBody PlatformNoticeDTO dataDTO) { messageService.sendNotice(dataDTO); @@ -61,6 +67,7 @@ public class PlatformController { } // 向一体化平台发送待办 + @PassOperation @PostMapping(value = "/sendToDo") public ResponseResult sendToDo(@RequestBody PlatformTaskDTO taskDTO) { messageService.sendToDo(taskDTO); @@ -68,6 +75,7 @@ public class PlatformController { } // 向一体化平台发送待办处置信息 + @PassOperation @PostMapping(value = "/sendHandleToDo") public ResponseResult sendHandleToDo(@RequestBody PlatformTaskHandleDTO handleDTO) { messageService.sendHandleToDo(handleDTO); diff --git a/cdaxxt-common/src/main/java/com/tobacco/mp/utils/AnnotationUtil.java b/cdaxxt-common/src/main/java/com/tobacco/mp/utils/AnnotationUtil.java index 1d9012d..17fca40 100644 --- a/cdaxxt-common/src/main/java/com/tobacco/mp/utils/AnnotationUtil.java +++ b/cdaxxt-common/src/main/java/com/tobacco/mp/utils/AnnotationUtil.java @@ -32,6 +32,7 @@ public class AnnotationUtil { /** * 加载自定义注解 + * 用以加载相关注解的接口 */ public void loadCustomAnnotation() { Map> mapApis = getAccessAnnotations(RESOURCE_PATTERN); diff --git a/cdaxxt-common/src/main/java/com/tobacco/mp/utils/SpringBeanUtils.java b/cdaxxt-common/src/main/java/com/tobacco/mp/utils/SpringBeanUtils.java new file mode 100644 index 0000000..ce2aee5 --- /dev/null +++ b/cdaxxt-common/src/main/java/com/tobacco/mp/utils/SpringBeanUtils.java @@ -0,0 +1,58 @@ +package com.tobacco.mp.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +@Component +public class SpringBeanUtils implements ApplicationContextAware { + + private static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + if(SpringBeanUtils.applicationContext == null) { + SpringBeanUtils.applicationContext = applicationContext; + } + } + + /** + * 获取applicationContext + * @return + */ + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + /** + * 通过name获取 Bean. + * @param name + * @return + */ + public static Object getBean(String name){ + return getApplicationContext().getBean(name); + } + + /** + * 通过class获取Bean. + * @param clazz + * @param + * @return + */ + public static T getBean(Class clazz){ + return getApplicationContext().getBean(clazz); + } + + /** + * 通过name,以及Clazz返回指定的Bean + * @param name + * @param clazz + * @param + * @return + */ + public static T getBean(String name,Class clazz){ + return getApplicationContext().getBean(name, clazz); + } + +}