新闻社面试
介绍下SSO 使用了哪些SSO中间件? SSO 和 AUTH 认证的区别?
| 特性 | AUTH (认证) | SSO (单点登录) |
|---|---|---|
| 范围 | 单个应用程序或系统 | 多个应用程序或系统 |
| 目标 | 验证用户身份 | 允许用户使用一组凭据访问多个应用程序,无需重复登录 |
| 实现 | 可以使用用户名/密码、OAuth、OpenID Connect 等方式 | 通常基于 OAuth 2.0、OpenID Connect、SAML 等协议,需要一个集中的认证服务器或中间件 |
| 用户体验 | 用户需要为每个应用程序单独登录 | 用户只需登录一次,即可访问所有已授权的应用程序 |
| 安全性 | 如果每个应用程序都独立管理认证,安全性可能参差不齐 | 集中管理认证,可以更方便地实施统一的安全策略,例如多因素认证、密码策略等 |
| 复杂性 | 相对简单 | 相对复杂,需要部署和配置认证服务器或中间件,并集成到各个应用程序中 |
-
sso java生态插件 使用的xxl-sso
概念 说明 SSO Server 中央认证服务,支持集群 SSO Client 接入 SSO 认证中心的 Client 应用 SSO SessionId 登录用户会话 ID,SSO 登录成功为用户自动分配 SSO User 登录用户信息,与 SSO SessionId 相对应 -
基于Cookie,相关概念
登陆凭证存储:登陆成功后,用户登陆凭证被自动存储在浏览器Cookie中
Client端校验登陆状态:通过校验请求Cookie中的是否包含用户登录凭证判断
系统角色模型:
SSO Server:认证中心,提供用户登陆、注销以及登陆状态校验等功能
Client应用:受SSO保护的Client端Web应用,为用户浏览器访问提供服务
用户:发起请求的用户,使用浏览器访问 -
基于Token,相关概念
登陆凭证存储:登陆成功后,获取到登录凭证(xxl_sso_sessionid=xxx),需要主动存储,如存储在 localStorage、Sqlite 中
Client端校验登陆状态:通过校验请求 Header参数 中的是否包含用户登录凭证(xxl_sso_sessionid=xxx)判断;因此,发送请求时需要在 Header参数 中设置登陆凭证
系统角色模型:
SSO Server:认证中心,提供用户登陆、注销以及登陆状态校验等功能
Client应用:受SSO保护的Client端Web应用,为用户请求提供接口服务
用户:发起请求的用户,如使用Android、IOS、桌面客户端等请求访问 -
未登录状态请求处理
基于Cookie,未登录状态请求:
页面请求:redirect 到SSO Server登录界面
JSON请求:返回未登录的JSON格式响应数据
数据格式:
code:501 错误码
msg:sso not login.
基于Token,未登录状态请求:
返回未登录的JSON格式响应数据
数据格式:
code:501 错误码
msg:sso not login.
设计一个投票系统 每人投票10次
- 前端
- 基础防抖
- 配合加载动画 防止误操作重复提交
- 页面性能优化
- 静态资源:将css js 图片等静态资源上传至CDN 利用CDN 节点换成 加速资源加载。降低源站带宽压力。
- 懒加载:若页面有投票结果展示、候选人列表等非关键内容,采用懒加载技术,滚动到可视区域再加载,减少首屏渲染时间
- 网关设计
- 流量接入和分发
- Nginx 配置:作为边缘网关,监听 80/443 端口,通过upstream配置后端业务服务集群,采用轮询或加权轮询策略分发请求,均衡负载;开启keepalive保持长连接,减少 TCP 握手开销。
API 网关:引入 Spring Cloud Gateway 或 Zuul,统一拦截投票请求,校验请求合法性(如 Token 有效性、参数格式),非法请求直接拦截,减少业务服务压力;同时通过Gateway Filter实现路由转发,将投票请求导向业务服务。
- Nginx 配置:作为边缘网关,监听 80/443 端口,通过upstream配置后端业务服务集群,采用轮询或加权轮询策略分发请求,均衡负载;开启keepalive保持长连接,减少 TCP 握手开销。
- 全局流控
- 基于 Nginx 的限流:利用ngx_http_limit_req_module,按 IP 维度设置请求速率(如 1 秒内单个 IP 最多 20 次请求),超出阈值返回 503,拦截恶意高频请求。
- 网关动态流控:结合 Sentinel 或 Hystrix,根据业务服务负载、QPS 动态调整流控规则,保障系统不被压垮;针对投票接口,设置单接口 QPS 上限(如 10 万 / 秒 ),超过则触发限流降级
- 流量接入和分发
- 业务层设计
- Redis 计数与校验:以用户ID + 日期为 Key(如vote:uid:123:20241001 ),Redis 的INCR命令实现原子计数,判断用户当日投票数是否≤10,若超限直接返回 “今日票数已用完”。
- 服务高可用与扩展
- 微服务集群: 将投票服务部署为多实例集群,通过注册中心(如 Nacos、Eureka)实现服务发现与注册,网关层动态路由请求到不同实例,故障时自动熔断、降级,保障服务连续性。
- 异步化优化:对于非关键逻辑(如投票成功后的积分发放、异步统计),引入消息队列(如 Kafka、RocketMQ),业务服务发送消息后立即返回响应,异步线程消费消息处理后续逻辑,提升接口响应速度。

浙公网安备 33010602011771号