千家信息网

SpringBoot怎么实现持久化登录状态获取

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,本篇内容主要讲解"SpringBoot怎么实现持久化登录状态获取",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"SpringBoot怎么实现持久化登录状态获
千家信息网最后更新 2024年11月24日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安全错误 数据库的锁怎样保障安全 boat联机服务器ip无法创建 ns帐号可以登录不同服务器吗 数据库怎么多行删除不了 crs数据库 软件开发设计的几个阶段 旧服务器生存视频 阿里海外服务器 文件上传 数据库数据安全监控 adb怎么查看服务器收到的请求 郑州软件开发公司复工日期 我的世界添加服务器怎么添加 中职教师网络技术 服务器 客户端 a6企业管理软件连接服务器 英雄联盟手游服务器公测 台达650w服务器电源 怎么查询华为服务器是不是原装的 寻求南京软件开发者合作 网络安全威胁四大类 数据库统计员工销售总额 做好网络安全和信息化工作 浙江信息化软件开发服务参考价格 网络安全共建单位主题党日 英雄联盟手游登录不上服务器维护 聊城企业邮箱服务器 化学品数据库技术移民 华为nova如何切换数据库 国图软件拆分数据库 安全第一课网络安全绘画图片 企业网站网络安全承诺书
0