SpringBoot怎么实现持久化登录状态获取
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"SpringBoot怎么实现持久化登录状态获取",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"SpringBoot怎么实现持久化登录状态获
千家信息网最后更新 2026年11月01日SpringBoot怎么实现持久化登录状态获取
本篇内容主要讲解"SpringBoot怎么实现持久化登录状态获取",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"SpringBoot怎么实现持久化登录状态获取"吧!
SpringBoot 持久化登录状态获取
1.编写登录的controller文件
写入cookie
//登陆成功后//...将用户账号信息存入数据库中//写cookie,(因存入数据库,无需写入session了) response.addCookie(new Cookie("token",token));2.编写首页Controller逻辑
@Controllerpublic class IndexController { @Autowired private UserMapper userMapper; @GetMapping("/") public String index(HttpServletRequest request){ Cookie[] cookies = request.getCookies(); if (cookies != null){ for (Cookie cookie : cookies) { if (cookie.getName().equals("token")){ String token = cookie.getValue(); System.out.println("准备进数据库"); User user = userMapper.findByToken(token); //去数据库寻找该token值的用户信息 System.out.println(user.toString()); if(user != null){ //若找到了这个用户信息 //写进session,让页面去展示 request.getSession().setAttribute("user",user); } break; } } } return "index"; }}3.运行测试,成功
SpringBoot 实现登录登出,登录态管理
账户模块中必要的功能登录登出,相信这个大家都经常使用了。简单介绍下在SpringBoot中的实现
先说下实现思路:
用户名密码存储在数据库中,前端发出请求,拦截器先检测用户有无登录,若有登录可直接请求接口。无需登录就可请求的接口需要加@NoLogin自定义注解。若未登录,前端跳转到登录页面,调用登录接口,系统在后台验证用户名密码,验证通过将用户信息存储在redis中和线程上下文中。
1.设计表结构
除了必要的用户名 密码 其他账户信息字段大家可根据自己系统需求添加。
CREATE TABLE `t_account` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(64) NOT NULL DEFAULT '' COMMENT '姓名', `mobile` varchar(32) NOT NULL COMMENT '手机号', `identity` varchar(32) NOT NULL COMMENT '身份证号码', `user_name` varchar(32) NOT NULL COMMENT '账户', `password` varchar(64) NOT NULL DEFAULT '' COMMENT '登录密码', `accept_region` bigint(20) NOT NULL COMMENT '受理中心(网点)编号', `status` int(11) NOT NULL DEFAULT '1' COMMENT '状态: 0 禁用,1 正常,9 删除', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_by` bigint(20) DEFAULT NULL COMMENT '创建人Id', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', `update_by` bigint(20) DEFAULT NULL COMMENT '修改人Id', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='C端网点人员账户表';
2.controller层
接收客户端传参,调用接口与数据库信息匹配,匹配成功返回用户信息。并且存储到redis中,且以当前回话sessionid为key,用户信息为value。
@RestController@RequestMapping(value = WebConstants.WEB_PREFIX + "/account")@Api(tags = "Account", description = "账户模块")@NoAuthpublic class AccountController { @Autowired private AccountService accountService; @Autowired private StringRedisTemplate redisTemplate; @PostMapping(value = "/login") @ApiOperation("登录") public ResponseVologin(@RequestBody LoginForm form, HttpServletRequest request, HttpServletResponse response) { HttpSession session=request.getSession(); AccountDto accountDto=accountService.login(form.getUserName(),form.getPassword()); if(null==accountDto){ throw new BizException("用户名或密码错误!"); } redisTemplate.opsForValue().set(session.getId(), JSON.toJSONString(accountDto)); AccountVo accountVo= BeanCopy.of(accountDto,new AccountVo()).copy(BeanUtils::copyProperties).get(); accountVo.setAceptRegion(AcceptRegionEnum.getDescByValue(accountDto.getAceptRegion())); return ResponseVo.successResponse(accountVo); } @Login @PostMapping(value = "/logout") @ApiOperation("登出") public ResponseVo logout(HttpServletRequest request,HttpServletResponse response){ HttpSession session=request.getSession(); session.invalidate(); redisTemplate.delete(session.getId()); return ResponseVo.successResponse(); } } 3.创建请求拦截器
创建一个请求拦截器,用于检测用户登录态。通过session_id检测redis中有没有用户信息。如果存在则将用户信息存储当前线程上下文中(用户线程上下文实质就是基于HashMap的缓存),便于后续使用。这一步也可以放在登录成功后(这样也更严谨)。
@Componentpublic class LoginInterceptor implements HandlerInterceptor { private Logger logger= LoggerFactory.getLogger(LoginInterceptor.class); @Autowired private StringRedisTemplate redisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HandlerMethod handlerMethod = (HandlerMethod) handler; Class> clazz = handlerMethod.getBeanType(); Method m = handlerMethod.getMethod(); //需登录才可以访问的(预约核验模块) if (clazz.isAnnotationPresent(NoLogin.class) || m.isAnnotationPresent(NoLogin.class)) { return true; } HttpSession session=request.getSession(); //检测redis中是否含有sessionId String val=redisTemplate.opsForValue().get(session.getId()); if(null!=val){ logger.info(val); AccountDto accountDto= JSON.parseObject(val,AccountDto.class); AcceptRegionUserVistor vistor=new AcceptRegionUserVistor(); BeanUtils.copyProperties(accountDto,vistor); AcceptRegionUserThreadContext.putSessionVisitor(vistor); return true; }else{ response.setStatus(401); throw new BizException("401","common.system.user.not.login"); } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }}注册拦截器:(注册后的拦截器才会生效哦)
@Configurationpublic class WebConfiguration extends WebMvcConfigurationSupport { @Autowired private LoginInterceptor loginInterceptor; /** * 拦截器配置 * * @param registry 注册类 */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor).addPathPatterns(WebConstants.WEB_PREFIX + "/**"); super.addInterceptors(registry); }}4.登出
获取到当前会话,清空回话信息,删除redis中对应sessionid的用户信息。代码见上第二段代码logout方法。
到此,相信大家对"SpringBoot怎么实现持久化登录状态获取"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
登录
用户
信息
数据
数据库
拦截器
状态
密码
账户
成功
接口
用户名
存储
检测
上下
上下文
模块
线程
必要
代码
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
华服互联网科技怎么样
中关村互联网 科技集团
互联网通讯科技
互联网科技作文
鑫亿盛互联网科技
互联网公司会议桌创意科技软装饰
栖莱科技互联网股份有限公司
互联网科技与大数据专业
翼展科技 首家互联网医院
四川慕妮娅互联网科技有限公司
卓翼科技产业互联网合作
中科明德北京互联网科技
北京市互联网新科技
上海创道互联网络科技有限公司
图游互联网科技
广州梦谷互联网科技有限公司领导
中国科技和美国互联网
中国互联网公司的科技投入
互联网领先科技成果宣传视频
广东猫王互联网科技有限公司电话
花魁咖啡
致聘互联网科技
美国互联网黑科技
卓越科技互联网 招聘
中国互联网公司排名锤子科技
晋城互联网科技
深圳互联网科技的发展
互联网领先科技宣传片
亚光科技低轨卫星互联网
科技互联网专业务虚会材料