用户会话拦截器
若用户未登录 不能进行某些操作 如修改用户信息等
业务思路:
- 从header中取出userId 和 token
- 判断token是可以取出userid和token 若未取出则表示未登录 抛出异常并返回
- 从redis中取出token信息 若未取出表示未登录
- 判断token是前端传入的token是否和redis中存储的token一直 若不一致提示会话失效 重新登录
将他们封装到BaseIntercepto中因为其他的拦截器可能会用到
@Component
public class BaseInterceptor {
protected static final String REDIS_USER_TOKEN = "redis_user_token";
protected static final String REDIS_USER_CACHE = "redis_user_cache";
@Autowired
private RedisOperator redisOperator;
public boolean verityUserToken(String userId, String userToken, String redisPrefix) {
if (StringUtils.isBlank(userId) && StringUtils.isBlank(userToken)) {
GraceException.display(ResponseStatusEnum.UN_LOGIN);
return false;
} else {
String redisUserToken = redisOperator.get(redisPrefix + ":" + userId);
if (StringUtils.isBlank(redisUserToken)) {
GraceException.display(ResponseStatusEnum.UN_LOGIN);
return false;
} else if (!userToken.equals(redisUserToken)) {
GraceException.display(ResponseStatusEnum.TICKET_INVALID);
return false;
}
}
return true;
}
}
拦截器调用BaseController验证合法即可
public class UserTokenInterceptor extends BaseInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String userToken = request.getHeader("headerUserToken");
String userId = request.getHeader("headerUserId");
return super.verityUserToken(userId, userToken, REDIS_USER_TOKEN);
}
}
之后在configuration中注入bean并注册拦截器即可
@Bean
public UserTokenInterceptor userTokenInterceptor() {
return new UserTokenInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userTokenInterceptor())
.addPathPatterns("/user/updateUserInfo")
.addPathPatterns("/user/getAccountInfo");
}
虽然道路是曲折的,但前途是光明的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律