首页 > 其他分享 >【第5章】SpringBoot实战篇之登录模式切换

【第5章】SpringBoot实战篇之登录模式切换

时间:2024-06-06 13:32:06浏览次数:26  
标签:实战篇 SpringBoot 登录 public token org import id String

文章目录


前言

前面分别介绍了本地Map和redis存储用户登录信息,但是第二天我登录就出现问题了,因为我Redis部署在虚拟机里面,不可能每次都专门启动虚拟机,来回替换代码也太麻烦,这里我们根据配置参数来控制下将用户信息存储到哪里。


一、接口扩展

开放扩展,关闭修改。

1. LoginStorage

package org.example.springboot3.bigevent.login;

/**
 * Create by zjg on 2024/6/3
 */
public interface LoginStorage {
    public void put(String id, String token);
    public String get(String id);
    public boolean remove(String id);
}

2. LocalLoginStorage

package org.example.springboot3.bigevent.login;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Create by zjg on 2024/6/3
 */
@ConditionalOnProperty(name="login.storage",havingValue = "0")
@Component
public class LocalLoginStorage implements LoginStorage{
    private Map<String,String> loginUsers=new ConcurrentHashMap<>(256);
    @Override
    public void put(String id, String token) {
        loginUsers.put(id, token);
    }

    @Override
    public String get(String id) {
        return loginUsers.get(id);
    }

    @Override
    public boolean remove(String id) {
        return loginUsers.remove(id)!=null;
    }

}

3. RedisLoginStorage

package org.example.springboot3.bigevent.login;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;

/**
 * Create by zjg on 2024/6/3
 */
@ConditionalOnProperty(name="login.storage",havingValue = "1")
@Component
public class RedisLoginStorage implements LoginStorage{
    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Override
    public void put(String id, String token) {
        stringRedisTemplate.opsForValue().set(id,token,24, TimeUnit.HOURS);
    }

    @Override
    public String get(String id) {
        return stringRedisTemplate.opsForValue().get(id);
    }

    @Override
    public boolean remove(String id) {
        return Boolean.TRUE.equals(stringRedisTemplate.delete(id));
    }
}

4. 参数配置

这个参数控制使用本地存储、还是redis存储,这样扩展起来也方便。

login:
  storage: 0

二、登录相关接口改动

1.登录接口

@Autowired
LoginStorage loginStorage;
@RequestMapping("login")
public Result login(@Valid User loginUser){
   String message="用户名/密码不正确";
   User user = userSerivce.findUserByName(loginUser.getUsername());
   if(user!=null){//用户存在
       if(user.getPassword().equals(Md5Util.getMD5String(loginUser.getPassword()))){//密码正确
           Map<String,Object> claims=new HashMap();
           claims.put("userId",user.getId());
           claims.put("username",user.getUsername());
           String token = JwtUtils.create(claims);
           loginStorage.put(user.getId().toString(),token);
           return Result.success("登录成功",token);
       }
   }
   return Result.error(message);
}

2. 登录拦截器

@Autowired
LoginStorage loginStorage;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
   String token = request.getHeader("Authorization");
   if(token!=null&&token.contains("Bearer")){
       String tokenStr = token.substring(token.indexOf("Bearer") + 7);
       boolean verify = JwtUtils.verify(tokenStr);
       if(verify){//此处解析loginUsers,验证用户已登录
           Map<String, Object> claims = JwtUtils.getClaims(tokenStr);
           if(tokenStr.equals(loginStorage.get(claims.get("userId").toString()))){
               ThreadLocalUtil.set(claims);//用户信息放置ThreadLocal
               return true;
           };
       }
   }
   response.setStatus(HttpStatus.UNAUTHORIZED.value());
   response.setContentType("application/json;charset=UTF-8");
   ObjectMapper objectMapper = new ObjectMapper();
   objectMapper.writerFor(Result.class);
   String message = objectMapper.writeValueAsString(Result.error("token验证失败,请重新获取token后重试!"));
   response.getWriter().println(message);
   return false;
}


总结

回到顶部

这样我们就可以通过参数login.storage的修改,灵活地调整用户登录信息的存储方式了。
后面的登出接口和修改密码接口也会涉及到模式的使用。

标签:实战篇,SpringBoot,登录,public,token,org,import,id,String
From: https://blog.csdn.net/qq_44824164/article/details/139425658

相关文章

  • 【毕业设计】基于SpringBoot星之语明星周边产品销售网站的设计与实现.zip
    1.项目概述随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势,针对这个问题开发一个专门适应洗衣店业务新的交流形式的网站。本文介绍了星之语明星周边产品销售网站的开发全过程。通过分析企业对于星之语明星周边产品销售网站的需求,创建了一个计算机管理星之语明星周边产......
  • JAVA计算机毕业设计基于的儿童疫苗预约系统(附源码+springboot+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着科技的进步和人们健康意识的增强,儿童疫苗接种已成为保障儿童健康成长的重要措施。然而,传统的疫苗预约方式往往存在诸多不便,如预约流程繁琐、信息......
  • JAVA计算机毕业设计基于的高校党务管理系统(附源码+springboot+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高校党建工作的不断深入和发展,党务管理面临着越来越多的挑战。传统的党务管理方式往往依赖于纸质记录和人工操作,效率低下且容易出错。为了提高党......
  • SpringBoot 请求响应
    SpringBoot请求响应来源于黑马程序员JavaWeb课程,总结笔记1.ApiFoxApifox快速入门教程2.基本参数简单参数:在向服务器发起请求时,向服务器传递的是一些普通的请求数据。//RequestController.javaimportjakarta.servlet.http.HttpServletRequest;importorg.springf......
  • JAVA计算机毕业设计基于的畅游旅游网(附源码+springboot+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在信息化和全球化的大背景下,旅游业作为现代服务业的重要组成部分,正在经历着前所未有的变革。畅游旅游网作为一个集旅游信息、服务、交易于一体的综合......
  • JAVA计算机毕业设计基于的仓库管理系统(附源码+springboot+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的迅猛发展和企业规模的不断扩大,仓库管理作为企业运营中不可或缺的一环,面临着日益复杂和多样化的挑战。传统的仓库管理模式依赖于人工操......
  • Sz-Admin | SpringBoot3 JDK21 Vue3开源后台RBAC管理系统 | 2024年好用的开源RBAC管理
    简介接触了很多优秀的开源和闭源项目,在使用过程中也发现一些问题,不甘满足的我遂产生了想法:于是利用休息时间编写了一套后台管理系统,它灵活、简洁、高效,拥抱最新的技术,因此Sz-Admin便诞生了,也意为升职Admin,升职加薪节节高。SzAdmin,一个基于SpringBoot3、Vue3和El......
  • springboot模块化开发项目搭建-完善
    1.克隆项目,打开项目 2.改造成模块,entrance不是加粗,说明不是模块,需要改成模块 3.添加mysql驱动、mybatis、数据库连接池,定义版本,刷新maven 4.启动......
  • 匿名登录详细教程
    创建并使用匿名用户通过MemFireCloud进行身份验证启用匿名登录功能可构建应用程序,为用户提供经过身份验证的体验,而无需用户输入电子邮件地址、密码、使用OAuth提供商或提供任何其他PII(个人身份信息)。稍后,准备就绪后,用户可以将身份验证方法链接到其帐户。匿名用户与......
  • 基于springboot实现餐饮管理系统项目【项目源码+论文说明】计算机毕业设计
    基于springboot实现餐饮管理系统演示摘要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用餐......