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

网站建设费属于宣传费吗优惠网站如何做

网站建设费属于宣传费吗,优惠网站如何做,邯郸信息港最新招聘信息,沧州网络推广管理公司背景介绍 在传统的Spring Boot项目中,用户登录认证常见的方案是使用JWT(JSON Web Token)来实现无状态的身份验证。JWT凭借自包含用户信息、方便前后端分离、性能较好等优势被广泛采用。 然而,在实际项目中,JWT也有一…

背景介绍

在传统的Spring Boot项目中,用户登录认证常见的方案是使用JWT(JSON Web Token)来实现无状态的身份验证。JWT凭借自包含用户信息、方便前后端分离、性能较好等优势被广泛采用。

然而,在实际项目中,JWT也有一定缺点,比如:

  • 不能主动失效(除非设计复杂的黑名单机制)

  • token刷新逻辑复杂

  • 服务器无法灵活控制单点登出

为了提升认证的灵活性和安全性,我将项目的登录鉴权方案由JWT切换成了 Redis + UUID Token 的模式,实现了服务端存储与校验,且支持token的自动续期。


为什么切换?

  • 支持主动注销:退出登录时,服务器可以直接删除Redis中对应的Token。

  • 便于统一管理Token生命周期:可以灵活设置过期时间和续期策略。

  • 方便单点登出和多端管理

  • 实现滑动过期(自动续期),提升用户体验。


方案架构

流程图

用户登录 -> 服务器生成UUID Token -> 保存Token对应的用户ID到Redis并设置过期 -> 返回Token给客户端 -> 客户端请求时携带Token -> 网关/服务端从Redis验证Token有效性 -> 每次请求时刷新Token过期时间(滑动过期) -> 用户退出登录时删除Redis中的Token

关键代码实现

1. 登录接口

@PostMapping("/login")
public Result<UserVO> login(@RequestBody LoginRequest loginRequest) {// 认证逻辑验证用户名密码(略)User user = userService.findByUsername(loginRequest.getUsername());if (user == null || !passwordEncoder.matches(loginRequest.getPassword(), user.getPassword())) {return Result.fail("用户名或密码错误");}// 生成 UUID TokenString token = UUID.randomUUID().toString();// 构建 Redis 键String redisKey = RedisKeyConstant.LOGIN_TOKEN_PREFIX + token;// 保存用户 ID 到 Redis,设置过期时间(30分钟)stringRedisTemplate.opsForValue().set(redisKey, String.valueOf(user.getId()), 30, TimeUnit.MINUTES);// 返回给前端UserVO userVO = new UserVO();userVO.setToken(token);// 其他用户信息设置略return Result.ok(userVO);
}

2. 网关全局过滤器(校验Token + 自动续期)

@Component
@RequiredArgsConstructor
public class AuthGlobalFilter implements GlobalFilter, Ordered {private final StringRedisTemplate redisTemplate;private final AntPathMatcher antPathMatcher = new AntPathMatcher();private final long TOKEN_EXPIRE_MINUTES = 30;@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String path = exchange.getRequest().getPath().toString();// 跳过无需认证路径if (isExclude(path)) {return chain.filter(exchange);}List<String> tokenList = exchange.getRequest().getHeaders().get("Authorization");if (tokenList == null || tokenList.isEmpty()) {return unauthorized(exchange);}String token = tokenList.get(0);// Redis校验Token是否有效String redisKey = RedisKeyConstant.LOGIN_TOKEN_PREFIX + token;String userId = redisTemplate.opsForValue().get(redisKey);if (userId == null) {return unauthorized(exchange);}// 续期(滑动过期)redisTemplate.expire(redisKey, TOKEN_EXPIRE_MINUTES, TimeUnit.MINUTES);// 把用户ID放入请求头,供后端服务使用ServerHttpRequest newRequest = exchange.getRequest().mutate().header("user-info", userId).build();return chain.filter(exchange.mutate().request(newRequest).build());}private boolean isExclude(String path) {// 这里可以配置白名单路径return path.startsWith("/public") || path.equals("/user/login");}private Mono<Void> unauthorized(ServerWebExchange exchange) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}@Overridepublic int getOrder() {return 0;}
}

3. 退出登录接口

@PostMapping("/logout")
public Result<Void> logout(@RequestHeader("Authorization") String token) {if (token == null || token.isEmpty()) {return Result.fail("未登录");}String redisKey = RedisKeyConstant.LOGIN_TOKEN_PREFIX + token;Boolean deleted = stringRedisTemplate.delete(redisKey);if (Boolean.TRUE.equals(deleted)) {return Result.ok();} else {return Result.fail("退出失败或已过期");}
}

4. 前端请求示例(基于axios)

import axios from 'axios';const myAxios = axios.create({baseURL: 'http://localhost:9090',withCredentials: true,
});myAxios.interceptors.request.use(config => {const token = localStorage.getItem('token');if (token) {config.headers['Authorization'] = token;}return config;
});myAxios.interceptors.response.use(response => {if (response.data.code === 40101) {alert('未登录,请重新登录');window.location.href = '/user/login';}return response.data;
});export default myAxios;

总结

  • 通过Redis + UUID Token方案,避免了JWT token的复杂管理。

  • 支持服务器主动失效token,支持滑动过期,提升了安全性和用户体验。

  • 网关统一校验token,简化后端服务实现。

  • 适合对token管理要求较高,需要灵活控制用户登录状态的项目。


未来展望

  • 可以结合Redis的Hash数据结构实现多端登录管理。

  • 增加刷新token接口,实现无感刷新。

  • 结合Spring Security进行更细粒度的权限控制。


希望这篇文章对你有所帮助,欢迎点赞和关注!如果你也在用Spring Boot做项目,不妨试试这个思路,灵活又实用。


文章转载自:

http://tj2cSd6D.frfpx.cn
http://Sntvsl0E.frfpx.cn
http://Ip4SkUHw.frfpx.cn
http://gRs6ZjsI.frfpx.cn
http://OO5bWoU7.frfpx.cn
http://DbzdTpXj.frfpx.cn
http://7xBHEGl1.frfpx.cn
http://Flomuzej.frfpx.cn
http://OueNjj17.frfpx.cn
http://pcrMvG7I.frfpx.cn
http://kVNVw3hf.frfpx.cn
http://3z3m07TI.frfpx.cn
http://MG82rH3v.frfpx.cn
http://GTyvIKjm.frfpx.cn
http://V6jN6cPv.frfpx.cn
http://giAAUkqC.frfpx.cn
http://81tYmmZo.frfpx.cn
http://S74aYMPu.frfpx.cn
http://VMqofZ83.frfpx.cn
http://PESmhWGw.frfpx.cn
http://0UoPNcQ3.frfpx.cn
http://8DUgVj69.frfpx.cn
http://ThbbCTZx.frfpx.cn
http://AiG2efDR.frfpx.cn
http://D9srgggo.frfpx.cn
http://WYgsyFyx.frfpx.cn
http://wkcEV0Hd.frfpx.cn
http://tH6BM3P8.frfpx.cn
http://JnJV80qg.frfpx.cn
http://xHoCKW23.frfpx.cn
http://www.dtcms.com/wzjs/778368.html

相关文章:

  • jw网站设计做电影网站要买什么
  • 做美图 网站有哪些上海装修公司电话
  • 用flash做的ppt模板下载网站手机版网页设计
  • 湛江网站排名提升wordpress 七牛上传插件
  • 北京网站建设排行榜网站制作商城
  • 网站页面设计技术参数wordpress 单页案例
  • 网站换域名 百度收录阿里云如何查看已建设好的网站
  • 外贸网站域名被封怎么投诉网络平台
  • 网站的首页文案长春建站服务
  • 蓬莱网站建设价格网络服务有点问题
  • 成品网站源码78w78使用方法新网站先做外链还是内容
  • 软件园专业做网站手机上如何上传wordpress
  • 广州正规网站建设公司免费外链代发
  • 如何做视频网站流程图清博舆情监测系统
  • 通过模版做网站免费微信小程序开发官网
  • 简述电子商务网站开发的研究意义精美网页模板
  • 景点网站应该怎么做网站建设课程有哪些收获
  • 做网站公司排行榜seo诊断站长
  • 东营网站建设那家好网站开发网站制作
  • 网站制作金华公司电话做短视频网站有流量吗
  • 免费产品推广网站做网络推网站推广的目的
  • 网站域名邮箱怎么注册ci框架建设网站
  • 网址搜索广州seo成功案例
  • 网站如何做搜狗搜索引擎运营方案模板
  • 服装网站建设平台分析十大企业网站排行榜
  • 怎样做网站公司的销售商标设计图案免费
  • 做网站前段可以考什么证书外国做美食视频网站
  • 寿光市住房和建设局网站四川省城乡住房和城乡建设厅网站
  • 张家口网站建设开发网站没内容 可以备案么
  • 什么是网站什么是网页c2c网站管理系统