前后端分离解决方案(通用3篇)

时间:2025-04-29 15:37:32 admin 今日美文

前后端分离解决方案 第1篇

登录后用户信息生成token,返回给前端,让前端携带token,后端则是使用该token生成前的值生成建K,用户信息作为V存入redis,校验的时候用于过滤请求

jwt过滤器

前端页面访问需要登录状态的页面时候也同上,带着token发送请求交给过滤器经行解析;如果能查到用户数据说明登录状态,否则跳到登录页面

PS:这个案列有用到了springsecurity 所以security需要详细配置

关键代码

上面我们讨论的是一般单体项目的前后端登陆验证,如果我们的业务范围扩大呢,比如分布式微服务

那么前端需要nginx负载均衡,后端就要通过网关进行路由匹配来进行验证登陆了 gate-way配置文件 主要是负责服务发现nacos bootstrap

网关在nacos的具体配置

微服务的登陆处理逻辑变成了网关统一入口,入口进行授权或者处理以后将重要信息放在请求头,这个请求链放给其他微服务 那么这个时候就有俩个情况,

过滤器代码

拦截器,我的要求是判断是否请求头带有网关处理的用户id

主要目的是判断是否登陆有凭证,并且保存到当前线程,随取随用 注册拦截器

如果不适用中间件

刚才之前的登录逻辑是采用redis+jwt的形式,登录成功后将用户的jwt存入redis,然后用uuid作为这个jwt的key,用户登录时候过滤器解析鉴权,然后把这个解析的jwt用户信息存入当前线程上下文ThreadLoacal 但是现在突然不适用redis了,那么我如何实现在线统计这样的需求呢,虽然还是可以使用直接返回前端jwt然后过滤器验证的方式,但是这样应该如何统计在线请人数这样,踢人下线呢?redis又叫做分布式会话,那么是不是也是说明本地的session也可以作为kv数据库,来实现对应功能只是无法多机共享而已呢?

redis 又作为分布式会话 所以session 也是可以会做会话的,而如果要做多级集群 或者实现统计强制下线等可以采用数据库的持久化实现

安全性分析 采用Redis+JWT的登录方案,通过UUID作为JWT的key存储在Redis中,并在过滤器中解析JWT后将用户信息存入ThreadLocal,这种设计具有以下优点和缺点:

优点: 分布式会话管理:利用Redis的分布式特性,支持多节点共享会话状态。 性能高效:Redis的高性能读写操作,保证了系统的高效性。 安全性:JWT本身具备防篡改和验证功能,结合Redis可以增强会话管理的安全性。 缺点: 依赖外部服务:依赖Redis,如果Redis服务不可用,系统的登录功能会受到影响。 复杂度增加:需要额外管理Redis连接和存储逻辑。 总体来说,这种设计在分布式系统中是比较安全和高效的,但也存在一定的依赖和复杂性。

在线用户统计和踢人下线 在不使用Redis的情况下,仍然可以实现在线用户统计和踢人下线的功能。以下是几种实现方式:

在线用户统计:在用户登录成功时,将用户信息存入Session,并维护一个全局的在线用户列表。在用户请求时更新Session的最后访问时间,通过定期扫描Session列表,移除过期的Session。 踢人下线:在需要踢人下线时,可以从全局在线用户列表中移除对应用户的Session,并使该Session失效。

在线用户统计:在用户登录时,将会话信息存储在数据库中。在用户请求时更新数据库中的最后访问时间。 踢人下线:在需要踢人下线时,从数据库中删除对应的会话记录。

在线用户统计:在用户登录时,将用户信息存入在线用户列表。在用户请求时更新用户的最后访问时间。 踢人下线:在需要踢人下线时,从在线用户列表中移除对应用户的信息。

不使用Redis的情况下,可以选择使用本地Session或数据库存储会话信息来实现在线用户统计和踢人下线的功能。这两种方式都可以在一定程度上满足业务需求,但需要根据具体场景选择合适的方案。基于JWT的方式虽然不依赖外部存储,但需要在应用层维护在线用户信息。

前后端分离解决方案 第2篇

在中找到了servlet映射

定位到SafeDispatcherServlet,根据目录结构和类文件名称找到了ServiceValidateController

ServiceValidateController

Cas20ProxyReceivingTicketValidationFilter添加encodeServiceUrl=false初始化参数

details/104990143

前后端分离解决方案 第3篇

前端第一次访问后端,servlet会自动用cookie携带sessionID创建session,且客户端再次访问都会携带cookie,当后端接收到前端传递的登录信息,我们调用mysql查询等操作完成以后在session存放用户数据

既然session域里面有数据,那么前端页面是不是可以在页面初始化时候进行访问一个校验判断呢,如果访问到对应数据说明在对应页面是登录状态,否则跳转登录页面,并且拦截登录后才能访问的接口 上面描述是手机号登陆,实际开发中往往为了数据库安全会对保存在数据库的密码进行加密 每个用户的盐是一个uuid或者时间搓组合的唯一值 通过这种方式更为安全,当然前端也不能使用明文, 比如前端和后端用统一的盐进行加密解密在进行二次加解密密

前端公钥加密:

后端私钥解密

那么现在采用jwt实现登陆校验

新版本依赖

当然java 工具包hutool也继承了jwt 可以使用hutool携带的jwt [HUTOOL官方文档]