1. SSO中的Cookie/Token生成与安全传递
- 生成Cookie/Token:
- Cookie:服务器通过
Set-Cookie
响应头生成,包含用户ID、过期时间等,需设置HttpOnly
和Secure
属性防止XSS和中间人攻击。 - Token(如JWT):使用签名算法(如HMAC或RSA)生成,包含用户信息(Payload)、签名和过期时间,示例:
String token = JWT.create().withSubject(userId).withClaim("role", "admin").sign(Algorithm.HMAC256("secret"));
- Cookie:服务器通过
- 安全传递:
- Cookie使用
Secure
(仅HTTPS传输)和SameSite
(防CSRF)。 - Token通过HTTP Header(如
Authorization: Bearer <token>
)传递,避免URL暴露。
- Cookie使用
- Session防泄露:
- 会话ID随机化,绑定客户端IP/User-Agent。
- 使用HTTPS加密传输,服务端存储Session时加密。
2. JetCache与Redis集群
- JetCache使用:
@Cached(name="userCache", expire=3600) public User getUserById(Long id) { /*...*/ }
- Redis集群一致性:
- 使用
RAFT
或Redlock
算法保证数据同步。 - 最终一致性场景:读从库,写主库。
- 使用
- 缓存无法删除:
- 检查Redis集群状态,手动执行
DEL key
。 - 设置缓存降级策略,如本地缓存兜底。
- 检查Redis集群状态,手动执行
- 多级缓存:
- 本地缓存(Caffeine)+ Redis缓存,通过注解
@CachePenetrationProtect
防穿透。
- 本地缓存(Caffeine)+ Redis缓存,通过注解
3. 动态数据源与多租户
- 动态切换逻辑:
- 使用
AbstractRoutingDataSource
,通过ThreadLocal绑定租户标识:public class TenantDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return TenantContext.getTenantId();} }
- 使用
- 多租户隔离:
- 按租户分库(物理隔离)或分表(逻辑隔离,如
tenant_id
字段)。
- 按租户分库(物理隔离)或分表(逻辑隔离,如
4. 自定义组件
- Spring Boot自定义组件:
- 定义Bean:
@Component public class CustomComponent { /*...*/ }
- 通过
@ConditionalOnProperty
按条件加载。 - 实现
ApplicationRunner
在启动时初始化。
5. MQ防消息丢失与死信队列
- 防丢失:
- 生产者:开启
confirm
机制(RabbitMQ)或事务(Kafka)。 - 消费者:手动ACK,消息持久化。
- 生产者:开启
- 死信队列自动化:
- 设置死信消息自动重试(如RabbitMQ的TTL+DLX)。
- 使用定时任务扫描死信队列重新投递。
6. 代码中定位生产者/消费者
- 查找方法:
- 生产者:搜索
@RabbitListener
或kafkaTemplate.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. 双亲委派模型
- 流程:
- 类加载器收到请求后,先委派父类加载。
- 父类无法加载时,自身尝试加载。
- 核心类(如
java.lang.*
)由Bootstrap加载器加载。
- 实现:
- 类加载器的
loadClass()
方法默认实现委派逻辑。
- 类加载器的
9. 打破双亲委派
- 场景:
- Tomcat为每个WebApp单独加载类。
- 热部署时重新加载修改后的类。
- 方法:
- 自定义类加载器,重写
loadClass()
逻辑。
- 自定义类加载器,重写
10. 注解作用位置选择
- AOP:业务逻辑增强(如日志、事务)。
- 拦截器:HTTP请求预处理(如权限校验)。
- MVC拦截器:Controller层拦截。
- 启动时刷新:使用
@PostConstruct
或ApplicationListener
。
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}
。
- 代码中通过MDC注入:
- 脱敏:
- 使用正则替换敏感字段:
<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授权码模式。
- CORS配置
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));
以上为具体问题的解决方案,如需进一步探讨某个点,可继续提问!