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

技术SpringBoot怎么实现持久化登录状态获取本篇内容主要讲解“SpringBoot怎么实现持久化登录状态获取”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringB

本文主要解释“SpringBoot如何实现持久的登录状态获取”。感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。让边肖带你学习“回弹如何实现持久登录状态获取”!

书写小甜饼

//成功登录后

//.将用户帐户信息存储在数据库中。

//写入cookie,(不需要写入会话,因为它存储在数据库中)

response . AddCookie(NewCookie(' token ',token));

SpringBoot 持久化登录状态获取

@控制器

publicclassIndexController{

@自动连线

privateUserMapperuserMapper

@GetMapping('/')

public stringindex(HttpServletrequest){ 0

cookie[]cookie=request . GetCooKies();

如果(饼干!=null){ 0

for(CookieTookie : CooKies){ 0

if(cookie.getName()。equals(' token '){ 0

string token=cookie . GetVaLue();

System.out.println('准备进入数据库');

user user=user mapper . findbytoken(令牌);//去数据库找这个令牌值的用户信息。

system . out . println(user . ToString());

if(用户!=null){//如果找到此用户信息

//写入会话,让页面显示。

nbsp;             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 = "账户模块")
@NoAuth
public 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的缓存),便于后续使用。这一步也可以放在登录成功后(这样也更严谨)。

@Component
public 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 { 
    }
}

注册拦截器:(注册后的拦截器才会生效哦)

@Configuration
public 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怎么实现持久化登录状态获取”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/77888.html

(0)

相关推荐

  • JDK源码阅读(7):ConcurrentHashMap类阅读笔记

    技术JDK源码阅读(7):ConcurrentHashMap类阅读笔记 JDK源码阅读(7):ConcurrentHashMap类阅读笔记JDK源码阅读(7):ConcurrentHashMap类阅读笔

    礼包 2021年11月25日
  • Mac v1.3.3如何使用专业视频转码器手刹?

    技术Mac专业的视频转码器HandBrake for Mac v1.3.3怎么用Mac专业的视频转码器HandBrake for Mac v1.3.3怎么用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因

    攻略 2021年12月24日
  • MySQL中SQL优化建议的示例分析

    技术MySQL中SQL优化建议的示例分析这期内容当中小编将会给大家带来有关MySQL中SQL优化建议的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。今天早上看到同事的一个优化需

    攻略 2021年11月29日
  • springboot动态切换数据源不重启(springboot 项目中多个数据源切换)

    技术Springboot动态切换数据源怎么实现这篇文章主要介绍“Springboot动态切换数据源怎么实现”,在日常操作中,相信很多人在Springboot动态切换数据源怎么实现问题上存在疑惑,小编查阅了各式资料,整理出

    攻略 2021年12月16日
  • DG Broker如何搭建

    技术DG Broker如何搭建这篇文章主要介绍了DG Broker如何搭建,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。DG Broker搭建 1.环境说

    攻略 2021年11月16日
  • 抖音刷100粉多少钱,刷抖音粉丝的作用?

    技术抖音刷100粉多少钱,刷抖音粉丝的作用?根据小编的了解,现在可以说在全民各行各业各个年龄层都大火的抖音短视频吸粉的速度也是十分快速的,而上面有很多网红粉丝量已经让人眼前一亮,大大惊艳了吃瓜群众。甚至有的普通人粉丝能达

    测评 2021年10月19日