当前位置: 首页 > news >正文

Java中常见的问题


1. SSO中的Cookie/Token生成与安全传递

  • 生成Cookie/Token
    • Cookie:服务器通过Set-Cookie响应头生成,包含用户ID、过期时间等,需设置HttpOnlySecure属性防止XSS和中间人攻击。
    • Token(如JWT):使用签名算法(如HMAC或RSA)生成,包含用户信息(Payload)、签名和过期时间,示例:
      String token = JWT.create().withSubject(userId).withClaim("role", "admin").sign(Algorithm.HMAC256("secret"));
      
  • 安全传递
    • Cookie使用Secure(仅HTTPS传输)和SameSite(防CSRF)。
    • Token通过HTTP Header(如Authorization: Bearer <token>)传递,避免URL暴露。
  • Session防泄露
    • 会话ID随机化,绑定客户端IP/User-Agent。
    • 使用HTTPS加密传输,服务端存储Session时加密。

2. JetCache与Redis集群

  • JetCache使用
    @Cached(name="userCache", expire=3600)
    public User getUserById(Long id) { /*...*/ }
    
  • Redis集群一致性
    • 使用RAFTRedlock算法保证数据同步。
    • 最终一致性场景:读从库,写主库。
  • 缓存无法删除
    • 检查Redis集群状态,手动执行DEL key
    • 设置缓存降级策略,如本地缓存兜底。
  • 多级缓存
    • 本地缓存(Caffeine)+ Redis缓存,通过注解@CachePenetrationProtect防穿透。

3. 动态数据源与多租户

  • 动态切换逻辑
    • 使用AbstractRoutingDataSource,通过ThreadLocal绑定租户标识:
      public class TenantDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return TenantContext.getTenantId();}
      }
      
  • 多租户隔离
    • 按租户分库(物理隔离)或分表(逻辑隔离,如tenant_id字段)。

4. 自定义组件

  • Spring Boot自定义组件
    1. 定义Bean:
    @Component
    public class CustomComponent { /*...*/ }
    
    1. 通过@ConditionalOnProperty按条件加载。
    2. 实现ApplicationRunner在启动时初始化。

5. MQ防消息丢失与死信队列

  • 防丢失
    • 生产者:开启confirm机制(RabbitMQ)或事务(Kafka)。
    • 消费者:手动ACK,消息持久化。
  • 死信队列自动化
    • 设置死信消息自动重试(如RabbitMQ的TTL+DLX)。
    • 使用定时任务扫描死信队列重新投递。

6. 代码中定位生产者/消费者

  • 查找方法
    • 生产者:搜索@RabbitListenerkafkaTemplate.send()
    • 消费者:查找@KafkaListener或消息处理类。
    • 使用IDE的“Find Usages”功能跟踪消息关键字。

7. 过滤器与分级认证

  • 过滤器链
    public class AuthFilter implements Filter {public void doFilter(request, response, chain) {if (isPublicAPI(request)) chain.doFilter();else checkToken(request); // 分级验证}
    }
    
  • 分级认证
    • 使用@PreAuthorize("hasRole('ADMIN')")(Spring Security)。

8. 双亲委派模型

  • 流程
    1. 类加载器收到请求后,先委派父类加载。
    2. 父类无法加载时,自身尝试加载。
    3. 核心类(如java.lang.*)由Bootstrap加载器加载。
  • 实现
    • 类加载器的loadClass()方法默认实现委派逻辑。

9. 打破双亲委派

  • 场景
    • Tomcat为每个WebApp单独加载类。
    • 热部署时重新加载修改后的类。
  • 方法
    • 自定义类加载器,重写loadClass()逻辑。

10. 注解作用位置选择

  • AOP:业务逻辑增强(如日志、事务)。
  • 拦截器:HTTP请求预处理(如权限校验)。
  • MVC拦截器:Controller层拦截。
  • 启动时刷新:使用@PostConstructApplicationListener

11. 安全问题示例

  • endsWith不安全
    • 可能被大小写或特殊字符绕过,如"admin".endsWith("min")误判。
  • lastIndexOf+substring安全
    int index = path.lastIndexOf("/");
    String suffix = path.substring(index); // 精确截取
    

12. 分布式追踪与日志脱敏

  • Trace ID
    • 代码中通过MDC注入:
      MDC.put("traceId", UUID.randomUUID().toString());
      
    • 日志框架(Logback)配置自动追加%X{traceId}
  • 脱敏
    • 使用正则替换敏感字段:
      <pattern>%msg|replace('password=".*?"', 'password=***')</pattern>
      

13. Token与机机调用验证

  • 动态Token(如JWT):每次生成新Token,需验签。
  • 静态Token(API Key):长期有效,需加密存储。
  • 机机调用不用Cookie
    • Cookie依赖浏览器上下文,机机调用无状态。
  • HTTPOnly作用:防止XSS窃取Cookie。
  • 跨域安全
    • CORS配置Access-Control-Allow-Origin白名单。
    • 使用OAuth2.0授权码模式。

14. Spring Security核心

  • 配置
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {protected void configure(HttpSecurity http) {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN");}
    }
    

15. 时间类型与工作日计算

  • 时间类型
    • LocalDate:日期(无时间)。
    • LocalDateTime:日期+时间。
    • ZonedDateTime:带时区。
  • 工作日计算
    • 使用TemporalAdjusters跳过周末:
      LocalDate date = startDate;
      while (workDays > 0) {date = date.plusDays(1);if (date.getDayOfWeek() != SATURDAY && date.getDayOfWeek() != SUNDAY) workDays--;
      }
      
    • 集成第三方API(如阿里云节假日接口)。

16. Map分组与SQL分组的取舍

  • 代码分组优势
    • 灵活处理复杂逻辑(如多层嵌套分组)。
    • 避免SQL性能瓶颈(大数据量时)。
  • 示例
    Map<String, List<Order>> ordersByCategory = orders.stream().collect(Collectors.groupingBy(Order::getCategory));
    

以上为具体问题的解决方案,如需进一步探讨某个点,可继续提问!

http://www.xdnf.cn/news/301843.html

相关文章:

  • Jupyter Notebook为什么适合数据分析?
  • [监控看板]Grafana+Prometheus+Exporter监控疑难排查
  • UE5 使用插槽和物理约束对角色新增的饰品添加物理效果
  • Maven依赖未生效问题
  • Houdini制作烟雾消散并导入UE5
  • UE5 Daz头发转Blender曲线再导出ABC成为Groom
  • 基于Blender的AI插件——2D图片生成3D模型
  • Python 中的数据结构介绍
  • LangChain:大语言模型应用的“瑞士军刀”入门指南
  • Sublime Text快速搭建Lua语言运行环境
  • vue3中解决 return‘ inside ‘finally‘ block报错的问题
  • 【AI】如何自己训练AI大模型
  • IP-Adapter
  • LeetCode 每日一题 2025/4/28-2025/5/4
  • 华为云短信接入实现示例
  • c#OdbcDataReader的数据读取
  • Blender 初学者指南 以及模型格式怎么下载
  • FPGA----基于ZYNQ 7020实现petalinux并运行一个程序
  • 赛灵思 XCZU11EG-2FFVC1760I XilinxFPGAZynq UltraScale+ MPSoC EG
  • 探索Hello Robot开源移动操作机器人Stretch 3的新技术亮点与市场定位
  • 在 GitLab 中部署Python定时任务
  • 在与大语言模型交互中的礼貌现象:技术影响、社会行为与文化意义的多维度探讨
  • 告别异步复杂性?JDK 21 虚拟线程让高并发编程重回简单
  • Webview通信系统学习指南
  • 基于C++的IOT网关和平台7:github项目ctGateway设备协议开发指南
  • 点分治解析
  • Spark,配置hadoop集群1
  • Spring AI Alibaba-03- Spring AI + DeepSeek-R1 + ES/Milvus + RAG 智能对话应用开发全流程
  • 从黔西游船侧翻事件看极端天气预警的科技防线——疾风气象大模型如何实现精准防御?
  • 微服务框架中@FeignClient远程调用,请求无法携带问题处理