前后端分离项目,token的生成及存储至redis数据库

JWT产生token,Redis数据库,存储token,设置过期时间,实现登陆认证,请求携带token才能访问接口 基于token的登录验证 实现 Redis数据库 存储token JWT 产生token 实现登录验证 4.设置过期时间,实现登陆认证, 5.请求携带token才能访问接口 token(令牌) 原理: 登录流程: 访问流程: 实现 下述代码的实现基于springboot 用户数据主要存储在mysql数据库的user表中 dao层使用了mybatis 1. Redis数据库 存储token 登录的信息仅需一个key-value,如果直接使用关系型数据库进行存储,则需要再建一个数据库表。而redis是 阅读详情

MD5加密类

package common;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5 {

    public static String getMd5(String plainText,int length ) {
        String result = "";
        try {
            MessageDigest md= MessageDigest.getInstance("MD5");

            md.update(plainText.getBytes());
            byte b[] = md.digest();
            int i;
            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if(i<0) i+= 256;
                if(i<16)
                    buf.append("0");
                buf.append(Integer.toHexString(i));
            }
            if(length==32) {
                //32位加密
                result = buf.toString();
            }else if(length==16) {
                //16位加密
                result = buf.toString().substring(8, 24);
            }else if(length==6){

                result = buf.toString().substring(0, 6);
            }else {
                return "";
            }
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return result;
    }


}

redis数据库类

package service.serviceImpl;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class RedisAPI {

     public JedisPool  jedisPool;


    public JedisPool getJedisPool() {
        return jedisPool;
    }

    public void setJedisPool(JedisPool jedisPool) {

        this.jedisPool = jedisPool;
    }

    public String get(String key){
        Jedis jedis=jedisPool.getResource();
        String value= jedis.get(key);
        jedisPool.returnResource(jedis);
        return value;
    }

    public String set(String key,String value){
        Jedis jedis=jedisPool.getResource();
        String result= jedis.set(key, value);
        jedisPool.returnResource(jedis);
        return result;
    }

    public String set(String key,int seconds,String value){
        Jedis jedis=jedisPool.getResource();
        String result=jedis.setex(key, seconds, value);
        jedisPool.returnResource(jedis);
        return value;
    }

    public boolean exists(String key){
        Jedis jedis=jedisPool.getResource();
        boolean result=jedis.exists(key);
        jedisPool.returnResource(jedis);
        return result;
    }

    public Long ttl(String key){
        Jedis jedis=jedisPool.getResource();
        Long result=jedis.ttl(key);
        jedisPool.returnResource(jedis);
        return result;

    }

    public Long dell(String key){
        Jedis jedis=jedisPool.getResource();
        Long result=jedis.del(key);
        jedisPool.returnResource(jedis);
        return result;

    }
}


token的生成和保存接口类

package service;

import entity.User;

public interface TokenService {

//生成token
public String generateToken(String userAgent, User user) throws Exception;

 //生成save
public void save(String token, User user) throws Exception;

public boolean validate(String userAgent,String token) throws Exception;}

token接口的实现类 token生成类型:PC-NAME-USERID-CREATIONDATE-RONDEM(6位)
既: PC-32位加密的用户名-用户id-年月日时分秒-6位随机数

package service.serviceImpl;

import com.alibaba.fastjson.JSON;
import common.MD5;
import entity.User;
import nl.bitwalker.useragentutils.UserAgent;
import org.springframework.stereotype.Service;
import service.TokenService;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;


@Service("tokenService")
public class TokenServiceImpl  implements TokenService {
       @Resource
       private RedisAPI redisAPI;
    @Override
      //   pc-32位加密的用户名-用户id-年月日时分 秒-6位随机数
    //前缀 PC-NAME-USERID-CREATIONDATE-RONDEM(6位)
    // 生成token
    public String generateToken(String userAgent, User user) throws Exception {
        StringBuilder  str=new StringBuilder();
        str.append("token:");
        //获取用户代理
        UserAgent agent=UserAgent.parseUserAgentString(userAgent);
        //判断是否是手机端还是电脑端
       if(agent.getOperatingSystem().isMobileDevice()){
           str.append("MOBILE-");
       }else{
           str.append("PC-");
       }
        str.append(MD5.getMd5(user.getName(),32)+"-");
        str.append(user.getId().toString()+"-");
        str.append(new SimpleDateFormat("yyyyMMddHHmmsss").format(new Date())+"-");
        str.append(MD5.getMd5(userAgent,6));

        return str.toString();
    }
@Override
// 保存token信息
public void save(String token,User user) throws Exception {
    if(token.startsWith("token:PC-")){
        redisAPI.set(token, 2 * 60 * 60, JSON.toJSONString(user));
    }else{
        redisAPI.set(token, JSON.toJSONString(user));
    }

}

@Override
public boolean validate(String userAgent, String token) throws Exception {
        String agentMd5 = token.split("-")[4];
      if(!redisAPI.exists(token)){
      return false;
      }else if(!MD5.getMd5(userAgent,6).equals(agentMd5)){
         return false;
      }

    return true;
 } }

用户service层

package service;

import entity.User;

public interface UserService {

    public User  login(String name, String password) throws Exception;

    public User findUser(String name)throws Exception;





}


用户service层实现类

```
package service;

import entity.User;

public class UserServiceImpl implements UserService{

    @Override
    public User login(String name, String password) throws Exception {
      User user=this.findUser(name);
      if(user!=null && user.getPassword().equals(password)){

          return user;
      }
       else
        return null;
    }

    @Override
    public User findUser(String name) throws Exception {


        return null;
  }
}

controller层

package Controller;


import common.MD5;
import entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import service.TokenService;
import service.UserService;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;


@Controller
@RequestMapping("/api")
   public class LoginController{

  @Resource
  private TokenService tokenService;

  @Resource
  private UserService userService;

  @RequestMapping(value="/dologin",method =RequestMethod.POST,
    produces = "application/json")
 public void login(@RequestParam String name, @RequestParam String password,
                   HttpServletRequest request){
      try {
          User user=userService.login(name, MD5.getMd5(password,32));
          if(user!=null && !user.equals("")){
             String userAgent=request.getHeader("user-agent");
             String token =tokenService.generateToken(userAgent,user);
             tokenService.save(token,user);
          }



      } catch (Exception e) {
          e.printStackTrace();
      }


  }  }

感觉有帮助,就关注下吧。谢谢!

Springboot2.x 整合shiro JWT redis 前后端分离 前言 原文地址:Springboot2.x 整合shiro JWT redis 前后端分离 如果你还对Shiro不太了解,请先看完上个教程:springboot2.x 整合shiro 本文整合shiro与JWT,其中数据库采用 用户->角色->权限 三层,JWT有token和refreshToken,其中refreshToken存储用的是redis,下面我们会一一介绍。 正文 流程 我... 阅读详情

相关推荐

Springboot+Jwt+Redis 完成Token登录认证

Springboot+Jwt+Redis 完成Token登录认证前言大致流程知识点一、Token二、JWT三、Redis实现部分引入依赖详细代码1.用户注册2.用户登录密码校验 前言 本章内容建立在Springboot 基础框架搭建好的基础上进行整合jwt+redis 实现token登录认证 大致流程 前端 :前端拿到登录名和密码,使用JSEncrypt实现rsa将密码进行加密(这个部分网上有很...

weixin_44914766的博客 7007

GenerateToken创建token工具类

GenerateToken package com.xuxu.core.token; import java.util.UUID; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframew...

踟蹰千年的博客 4326

在Spring Boot+Vue前后端分离的项目中使用JWT实现基本的权限校验

通过 JWT 实现用户认证和权限校验。使用拦截器拦截请求并校验 Token 和权限。前端存储 Token 并在请求时携带。实现简单、灵活,适合小型项目或对权限要求不高的场景。通过生成一次性Token并在使用后立即删除,可以有效防止Token被重复使用,增强系统安全性。通过数据库存储Token并标记其使用状态,可以实现一次性Token的校验。虽然这种方式比使用Redis等缓存组件稍显复杂,但在不依赖第三方组件的情况下,是一种可行的解决方案。

没刮胡子的程序员专栏 255

java令牌验证使用token和redis实现思路

一个标准项目中,会有拦截器!既然有拦截器,就有它放行规则。这里说一下,放行的规则使用到uuid生成token,然后把token,存放在redis中。前端访问时,带上token请求头。响应回来,把token存在本地中,以备下次使用! 1、生成Token令牌 String token=UUID.randomUUID()+""; 使用到UUID,因为他具有唯一性 2、存入Redis中 redisTemplate.opsForValue().set(token,user,Duration.ofMinute.

Linlietao0587的博客 3981

【SpringBoot】整合SpringSecurity前后端分离基于Token实现登录鉴权

本文介绍了基于Token的前后端分离鉴权方案,通过数据库存储Token实现用户认证。

死牛胖子的技术随笔 2678

YOLOv11 改进策略 | HWD:引入 Haar 小波变换,减少信息丢失

在卷积神经网络(CNN)中,下采样(Downsampling)是降低特征图分辨率、扩大感受野的关键操作,通常通过最大池化(MaxPool)或步长为 2 的卷积(Strided Convolution)实现。然而,这些方法在降低分辨率的同时,往往会丢失图像中的高频细节信息(如边缘、纹理)和精确的空间位置信息,这可能对后续特征提取和目标检测精度产生不利影响,尤其是对于小目标和需要精细定位的任务。

走向CTO的路上... 1788

java中生成Token(超实用)

java中生成Token(JWT) 今天给大家分享一篇java中生成token的实例 ![BAOBAO](https://img-blog.csdnimg.cn/20210127104604249.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ2Mzc5Mzcx,size_16,color_FFFFFF,t_70#pic_center)

Spring丶王不正-传记 1万+

AB脉冲详解(编码器,PLC,上位机)

编码器线有些是用不到的。Z脉冲:360度中,只有1度是输出,输出能力是。编码器实际就是发光二极管,所以电流超过20ma会缩短寿命或损坏。

cfqq1989的博客 1万+

java 生成token 实例_Java大白话—–Token入门案例(附demo下载)

Java大白话—–Token入门案例Token入门案例今天为大家介绍一下Token的基本原理(以最直白的方式)两片同样的钥匙这是一家神奇的酒店,所有的客房居然都没有钥匙孔,可是每间房们前都做着一位钥匙匠。这种革命性的酒店安全管理方式是这样的:客人来到大厅,告诉前台他的账号与密码,前台给了他一把钥匙他拿着钥匙来到房门前,钥匙匠询问了他的姓名,随即做出了一把钥匙,再与前台的钥匙进行比对,如果一致,用户...

weixin_29447313的博客 1468

【近源攻击】badusb制作

BadUSB是利用伪造HID设备执行攻击载荷的一种攻击方式。HID(Human InterfaceDevice)设备通常指的就是键盘鼠标等与人交互的设备,用户插入BadUSB,就会自动执行预置在固件中的恶意代码。BadUsb插入后,会模拟键盘鼠标对电脑进行操作,通过这些操作打开电脑的命令终端,并执行一条命令,这条命令将从指定网址下载其他代码并于后台静默运行。这些代码功能包括:窃取信息、反弹shell、发送邮件等,从而实现控制目标机或者窃取信息的目的。

qinjilll的博客 2548

SAP SD跨公司销售IDOC自动记账配置实战指南

本文详细介绍了SAP SD模块中跨公司销售IDOC自动记账的配置实战指南。通过IDOC技术实现集团企业间交易的自动化处理,显著提升财务效率和准确性。文章涵盖前置配置、RFC连接、合作伙伴参数设置及财务科目分配等关键步骤,并提供了常见错误排查和性能优化建议,帮助用户快速掌握这一高效业务流程。

weixin_29284885的博客 769

前后端分离项目中 Token 与 Session 结合使用的实际案例解析

前后端分离项目中的Token与Session结合实践 摘要:本文探讨了前后端分离架构中Token与Session结合使用的三种典型案例。在电商平台场景中,采用JWT+Redis Session方案,通过JWT实现无状态认证,同时利用Redis管理Token有效性,解决了JWT无法主动失效的问题。文章详细展示了Spring Boot实现代码,包括登录接口、登出接口和拦截器设计,重点演示了如何生成带状态的JWT、通过Redis管理会话状态以及验证流程。该方案兼顾了无状态扩展性和安全管理的需求,适用于需要高并发和

xxxxxxllllllshi的博客 1082

视频编解码——视频编解码器工作原理

目录什么是视频编解码器为什么需要视屏编解码器视频编码器与数字视频容器时评编码器的历史 什么是视频编解码器 简单来说就是用于压缩或解压数字视频的软件或硬件 编码是信息从一种形式或格式转换为另一种形式的过程,解码是编码的反向。 适用于视频 编码是将视频、音频的原始格式的文件通过压缩技术转换成另一种格式(视频如h.264,h.265,m-jpeg等)。 解码是编码的反向过程。应用中,一般是将h.264,h.265格式数据解码成如YUV格式裸流交给显示器显示。 为什么需要视屏编解码器 需要在有限的带宽或存储空间

路人coder 1万+

springboot 前后端分离项目 生成验证码

springboot 前后端分离项目 生成验证码 不说废话,上代码 添加pom,将生成的验证码放到redis中 &amp;amp;lt;!--图片验证码--&amp;amp;gt; &amp;amp;lt;dependency&amp;amp;gt; &amp;amp;lt;groupId&amp;amp;gt;com.github.penggle&amp;amp;lt;/groupId&amp;amp;gt;

fengzyf的博客 4323

《一》:LBE,VR 大空间系列——场景环境需求解析

当前,大量 VR 体验活动在室内场地开展。因此,对于场地照明有特定要求:除天花板外,场地的所有表面均需有照明覆盖。这是为了保证玩家无论处于场地的哪个位置,地面与墙面都不会出现明显的影子。场地内不建议安装射灯或高强度的点光源,若已安装此类灯具,需使用柔光板进行遮盖。此外,要避免在阳光下使用 VR 设备台。参考图(请忽略其中Maker标签)

unitygroup的博客 943

论文阅读: SIGIR 2025 ID-Free Not Risk-Free: LLM-Powered Agents Unveil Risks in ID-Free Recommender Syste

咱们平时用的推荐系统(比如购物APP推商品、视频APP推剧),大多是“有ID”的——每个用户、每个商品都有个专属ID,系统靠这些ID记录你的浏览、购买历史,再给你推喜欢的东西。但这种方式有个大问题:新用户、新商品刚上线时没有ID历史数据,系统没法精准推荐,这就是“冷启动”难题。后来人们搞出了“无ID推荐系统”:不用ID了,改成直接分析商品的文字信息(比如商品标题、描述),靠大语言模型(LLM,类似ChatGPT的技术)把文字转成“语义代码”,再通过这些“代码”判断你可能喜欢什么。

CSPhD-winston的博客 977

前后端分离项目token怎么验证_前后端分离项目 — 基于SpringSecurity OAuth2.0用户认证...

1、前言现在的好多项目都是基于APP移动端以及前后端分离的项目,之前基于Session的前后端放到一起的项目已经慢慢失宠并淡出我们视线,尤其是当基于SpringCloud的微服务架构以及Vue、React单页面应用流行起来后,情况更甚。为此基于前后端分离的项目用户认证也受到众人关注的一个焦点,不同以往的基于Session用户认证,基于Token的用户认证是目前主流选择方案(至于什么是Token认证...

weixin_39634876的博客 621

YOLOv11的流形学习压缩:局部线性嵌入(LLE)引导的特征降维,实现在CSP模块中嵌入流形结构保持约束

摘要 本文探讨了流形学习在YOLOv11目标检测模型中的应用,重点研究局部线性嵌入(LLE)方法对CSP模块的特征压缩优化。针对深度学习模型的高维特征冗余问题,LLE通过三个关键步骤实现非线性降维:寻找k近邻、计算重构权重和低维嵌入,相比传统PCA方法能更好地保持数据的局部结构。文章详细分析了LLE的数学原理和参数选择策略,并提出在YOLOv11的CSP模块中嵌入流形约束的创新设计。通过特征分割前、处理过程和融合阶段引入流形一致性损失函数,该方法能在降低特征维度的同时保持原始流形结构,从而提升模型的计算效率

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1380

ThinkPHP6 前后端分离实践:基于Redis的图形验证码接口设计与实现

本文详细介绍了在ThinkPHP6前后端分离项目中,如何改造传统的Session依赖型验证码。通过集成Redis作为高性能存储介质,设计并实现了独立的图形验证码生成与校验接口,解决了无状态API通信下的验证码状态管理难题,并提供了完整的安全强化与优化建议。

study的专栏 724

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

springboot+redis实现token机制

项目结构 pom.xml &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt; &lt;/dependency...

风情 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【前后端分离登录流程】

最近公司再做前后端分离得项目,我负责设计前后端分离得登录流程,由于是前后端分离,所以传统得登录信息存入session就不适用了,这个时候登录信息 页面交互信息应该怎么办呢? 我暂时想到一种 用redis存入登录信息具体操作如下 1.流程图 2.账号信息存储以及数据格式 方案一.启动完之后查询数据库信息 初始化账号相关信息到redis 方案二.维护账号数据的时候同时修改redis账号信息数据 账号信息存储格式为 accinfo:账号的方式作为redis的key存储 例如:key为accinfo:z

qq_39745959的博客 3091

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

前后端分离之用户登录状态管理和校验

最新更新时间:2019年06月10日17:23:05 《猛戳-查看我的博客地图-总有你意想不到的惊喜》 本文内容:前后端开发分离,如何实现用户登录状态监控和校验,要解决的几个问题: A用户登录A机器成功,此时A用户登录B机器,A机器的A用户登录状态需要下线,即保证一个用户只能同时在线一台机器; A用户登录成功,一周之内不需要再次登录; 实现原理 用户首次访问站点,后端从请求体中读取co...

万少博-FE 1万+

node.js实现token验证——从数据库验证登录到redis存储

做过前后端分离项目的同学应该都做过 token 验证,在前端登录的时候需要缓存后端传过来的 token,然后在需要验证权限的接口带上 token。本章节来实现使用 node 进行 token 的权限验证。

weixin_43930421的博客 2189

【SpringBoot框架篇】16.security整合jwt实现对前后端分离的项目进行权限认证

使用Spring Security+JWT实现对前后端分离的项目进行权限认证

皓亮君的博客 5654

前后端分离架构下Sa-Token认证授权实践指南

在现代Web开发中,前后端分离架构已成为主流技术方案,这种架构下的认证授权机制面临跨域通信、无状态会话管理等核心挑战。JWT和OAuth2.0等标准协议虽然提供了基础解决方案,但在实际工程落地时仍需处理令牌管理、权限控制等具体问题。Sa-Token作为轻量级Java权限认证框架,通过自动续期Token、注解式权限控制等特性,显著降低了分离架构的安全实现复杂度。该框架特别适合SpringBoot+Vue等技术栈的中大型项目,能有效解决接口级权限校验、分布式会话同步等典型场景需求。本文通过企业级项目实战,详解如

weixin_30315723的博客 397

Spring Security+JWT+Redis实现项目级前后端分离认证授权

本文介绍了一种前后端分离架构下,基于Spring security框架进行用户认证授权的方法,其中包括登录、登出、认证、授权、密码加密、jwt等知识点

weixin_71894495的博客 2126
上一篇: redis数据库存储数据
下一篇: ubuntu详细安装过程
javaChengXuY
博客等级 码龄8年 15粉丝 38原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值