iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >SpringBoot怎么实现持久化登录状态获取
  • 290
分享到

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

2023-06-25 14:06:00 290人浏览 独家记忆
摘要

本篇内容主要讲解“SpringBoot怎么实现持久化登录状态获取”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springBoot怎么实现持久化登录状态获取”吧!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 ResponseVo<AccountVo>login(@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;              @Override    public void addInterceptors(InterceptorReGIStry registry) {                registry.addInterceptor(loginInterceptor).addPathPatterns(WebConstants.WEB_PREFIX + "/**");         super.addInterceptors(registry);    }}

4.登出

获取到当前会话,清空回话信息,删除redis中对应sessionid的用户信息。代码见上第二段代码logout方法。

到此,相信大家对“SpringBoot怎么实现持久化登录状态获取”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: SpringBoot怎么实现持久化登录状态获取

本文链接: https://www.lsjlt.com/news/305208.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot怎么实现持久化登录状态获取
    本篇内容主要讲解“SpringBoot怎么实现持久化登录状态获取”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot怎么实现持久化登录状态获取”吧!SpringBoot 持久化登录...
    99+
    2023-06-25
  • SpringBoot如何实现持久化登录状态获取
    目录SpringBoot 持久化登录状态获取1.编写登录的controller文件2.编写首页Controller逻辑3.运行测试,成功SpringBoot 实现登录登出,登录态管理...
    99+
    2024-04-02
  • vue页面状态持久化怎么实现
    本篇内容介绍了“vue页面状态持久化怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!需求:左树右表。组织树选中某一节点后,进入详情页面...
    99+
    2023-06-21
  • Vue注册模块与登录状态的持久化实现方法详解
    目录整体框架1. 前端页面授权2. 实现注册页面3. 实现登录状态的持久化优化前端整体框架 1. 前端页面授权 当我们登录网站的时候,如果没有登录,强制让用户重定向到 登录界面 在...
    99+
    2024-04-02
  • Playwright中怎么保持登录状态
    本篇内容主要讲解“Playwright中怎么保持登录状态”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Playwright中怎么保持登录状态”吧!引言在编写UI自动化测试用例的时候,通常会采用每...
    99+
    2023-06-25
  • Pinia状态持久化问题怎么解决
    本篇内容介绍了“Pinia状态持久化问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Pinia状态持久化在vue3中,常用Pini...
    99+
    2023-07-05
  • js实现本地持久化存储登录注册
    本文实例为大家分享了js实现本地持久化存储登录注册的具体代码,供大家参考,具体内容如下 1.登录html文件 <!DOCTYPE html> <html lang...
    99+
    2024-04-02
  • vuex持久化怎么实现
    本篇内容介绍了“vuex持久化怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vuex持久化vuex:刷新浏览器,vuex中的stat...
    99+
    2023-06-22
  • redis怎么实现持久化
    本篇内容介绍了“redis怎么实现持久化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Redis持久化的方...
    99+
    2024-04-02
  • Redis持久化怎么实现
    本篇内容主要讲解“Redis持久化怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis持久化怎么实现”吧!Redis是一种高级key-value数据库。它跟memcached类似,不...
    99+
    2023-06-28
  • android登录状态改变功能怎么实现
    要实现Android登录状态的改变功能,可以通过以下步骤实现:1. 创建一个用户登录状态的变量(例如:isUserLoggedIn)...
    99+
    2023-08-26
    android
  • SpringBoot+JWT实现注册、登录、状态续签流程分析
    目录一、实现流程1.注册2.登录3.登录保持【状态续签】二、实现方法1.引入依赖2.application配置文件3.mysql建表4.Bean三、测试1.注册2.登录3.状态续签【...
    99+
    2024-04-02
  • kubernetes数据持久化StorageClass动态供给怎么实现
    这篇文章主要讲解了“kubernetes数据持久化StorageClass动态供给怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“kubernetes数据持久化StorageClass...
    99+
    2023-07-04
  • Vuex数据持久化怎么实现
    小编给大家分享一下Vuex数据持久化怎么实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是vuexvuex :是一个专为vue.js开发的状态管理器,采用集...
    99+
    2023-06-15
  • mongodb数据持久化怎么实现
    在MongoDB中,数据持久化是通过将数据写入硬盘来实现的。MongoDB会在后台自动将数据写入到磁盘中,以确保数据的持久性。 Mo...
    99+
    2023-10-21
    mongodb
  • android数据持久化怎么实现
    在Android中,有多种方式可以实现数据持久化,下面列举了几种常见的方法:1. Shared Preferences(共享首选项)...
    99+
    2023-10-21
    android
  • mysql怎么实现数据持久化
    MySQL可以通过以下几种方式来实现数据持久化: 使用磁盘存储:MySQL将数据存储在硬盘上,包括数据文件、日志文件等。这样即使...
    99+
    2023-10-21
    mysql
  • Redis怎么实现数据持久化
    Redis 有两种数据持久化的方式:RDB持久化和AOF持久化。 RDB持久化: RDB持久化是通过定期将内存中的数据快照写入磁...
    99+
    2024-05-07
    Redis
  • 非Vuex怎么实现的登录状态判断封装
    本篇内容介绍了“非Vuex怎么实现的登录状态判断封装”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!登录状态封装我们如果想要普通封装登录状态的...
    99+
    2023-06-29
  • Tomcat中怎么实现session持久化
    在Tomcat中,可以通过配置一个Store元素来实现Session持久化。Store元素可以指定一个用于存储Session数据的存...
    99+
    2024-04-03
    Tomcat
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作