JWT令牌实现登陆校验

一、JWT出现的背景

jwt令牌出现的背景,比如我们通过一个路由访问网站的时候,有些游客在知道url的情况下会跳过用户登录直接访问其他网页,这样不仅在逻辑上说不通(我没登陆咋就能使用其他功能?)还会造成信息泄露和访问不安全。这时候jwt令牌的出现就填充了这一空白。

具体地,在用户登陆之后生成一个JWT令牌,然后将该令牌下发给客户端,客户端将该令牌存储起来,在之后的每一次请求都将令牌带到服务端,服务端接受该请求之后对这个请求进行统一拦截,获取到令牌并验证真伪,如果令牌无效,直接拦截,如果有效则放行。

二、实战

首先项目目录如下,项目所需文件红框圈出:

2.1 pom.xml: 将JWT的依赖包引入pom文件中:

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

有需要自取:pom.xml一些必不可少的配置-CSDN博客 

 2.2 JwtUtils:工具类,用于jwt令牌的创建和解码

package com.bytedance.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;

public class JwtUtils {

    private static String signKey = "itheima";
    private static Long expire = 43200000L; // 24小时候过期

    /**
     * 生成JWT令牌
     * @param claims JWT第二部分负载 payload 中存储的内容
     * @return
     */
    public static String generateJwt(Map<String, Object> claims){
        String jwt = Jwts.builder()
                .addClaims(claims)
                .signWith(SignatureAlgorithm.HS256, signKey)
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                .compact();
        return jwt;
    }

    /**
     * 解析JWT令牌
     * @param jwt JWT令牌
     * @return JWT第二部分负载 payload 中存储的内容
     */
    public static Claims parseJWT(String jwt){
        Claims claims = Jwts.parser()
                .setSigningKey(signKey)
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }
}

2.3 LoginController.java : 创建登陆界面的接口,由前端提交员工信息(这里是一个Emp对象其实只需要username和password参数),当调empService这个bean对象的方法时传入,empService又调用empMapper的bean对象去数据库里检索是否有这个username和password,有的话则生成令牌并将生成的令牌作为返回信息返回即可,否则返回错误提示。

package com.bytedance.controller; // 改成自己包名


import com.bytedance.pojo.Emp;
import com.bytedance.pojo.Result;
import com.bytedance.service.EmpService;
import com.bytedance.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
public class LoginController {

    @Autowired
    private EmpService empService;
    @PostMapping("/login")
    public Result login(@RequestBody Emp emp){
        log.info("员工登陆的信息:{}",emp);
        Emp e = empService.login(emp);

        // 如果登陆成功,生成令牌,下发令牌

        if (e != null){
            Map<String,Object> claims = new HashMap<>();
            claims.put("id",e.getId());
            claims.put("name",e.getName());
            claims.put("username",e.getUsername());
            String jwtcode = JwtUtils.generateJwt(claims);
            return Result.success(jwtcode);
        }
        // 登陆失败,返回错误信息
        else{
            return Result.error("用户名或密码失败~");
        }
    }
}

2.4 EmpService.java : 这是一个接口,定义了login方法给实现类去实现。

package com.bytedance.service;

import com.bytedance.pojo.Emp;
import com.bytedance.pojo.PageBean;
import org.springframework.format.annotation.DateTimeFormat;

import java.time.LocalDate;
import java.util.List;

public interface EmpService {

    Emp login(Emp emp);
}

2.5 EmpServicelmpl.java : EmpService的实现类,实现了login函数。这个login方法将接收到的emp对象传入empMapper类中的getByUsernameAndPassword方法,该方法去数据库中查询是否有一致的username和password。

package com.bytedance.service.impl;


import com.bytedance.mapper.EmpMapper;
import com.bytedance.pojo.Emp;
import com.bytedance.pojo.PageBean;
import com.bytedance.service.EmpService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@Service
public class EmpServicelmpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;


    @Override
    public Emp login(Emp emp) {
        return empMapper.getByUsernameAndPassword(emp);
    }
}

2.6 EmpMapper.java : 里面的getByUsernameAndPassword方法负责查询是否存在登陆的信息并返回结果。

package com.bytedance.mapper;
import com.bytedance.pojo.Emp;
import org.apache.ibatis.annotations.*;
import java.time.LocalDate;
import java.util.List;

@Mapper
public interface EmpMapper {
     @Select("select * from emp where username = #{username} and password = #{password}")
     Emp getByUsernameAndPassword(Emp emp);
}

三、验证

这样在前端页面就不能跳过登陆访问其他功能啦~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/434474.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

指针乐园--下

大家好这里是指针乐园下&#xff0c;下面我们开始喽&#xff01;&#xff01; 文章目录 目录 文章目录 前言 一、字符以及数组指针 二、函数指针变量以及函数指针数组 函数指针变量的使⽤ 通过函数指针调⽤指针指向的函数。 函数指针数组 总结 前言 我们今天会学习数组指针&…

LeNet训练集详细实现

一、下载训练集 导包 import torch import torchvision import torch.nn as nn from model import LeNet import torch.optim as optim import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as npToTensor()函数&#xff1a; 把图像…

npm 私服以及使用

在工作中&#xff0c;公司有很多内部的包并不希望发布到npm官网仓库&#xff0c;因为可能涉及到一些私有代码不能暴露。对于前端来讲&#xff0c;这时就可以选择在公司内网搭建npm私有仓库。当前比较主流的几种解决方案&#xff1a;verdaccio、nexus、cnpm。大家可以按照自己的…

限时特惠,立即购买CST电磁仿真软件,享受超值优惠与高质量服务

在电磁仿真领域&#xff0c;CST软件以其卓越的性能和广泛的应用成为了行业内的佼佼者。现在&#xff0c;我们非常高兴地宣布&#xff0c;为庆祝CST软件的持续创新与客户支持&#xff0c;我们推出限时特惠活动&#xff01;&#xff08;联系CST软件中国区代理亿达四方&#xff0c…

RabbitMQ如何保证消息不丢

如何保证Queue消息能不丢呢&#xff1f; RabbitMQ在接收到消息后&#xff0c;默认并不会立即进行持久化&#xff0c;而是先把消息暂存在内存中&#xff0c;这时候如果MQ挂了&#xff0c;那么消息就会丢失。所以需要通过持久化机制来保证消息可以被持久化下来。 队列和交换机的…

React Vite 构建工具如何查看代码占用体积

首先安装 Vite 中的 rollup-plugin-visualizer 插件 cnpm install rollup-plugin-visualizer 接着在你的 vite.config.ts 中引入并且使用到 plugins 中 import { visualizer } from "rollup-plugin-visualizer";export default defineConfig({plugins: [react(),vi…

现代信号处理学习笔记(三)现代谱估计

现代谱估计是信号处理和统计领域的一个重要主题&#xff0c;它涉及从信号中估计其频谱内容的方法。频谱表示一个信号在不同频率上的成分强度。谱估计在许多应用中都很重要&#xff0c;如通信系统、雷达、音频处理、生物医学工程等领域。 目录 前言 一、基础知识 1、功率谱估…

同步通信和异步通信(RabbitMq学习前篇)

MQ学习前篇 文章目录 MQ学习前篇1、同步和异步通讯1.1、同步通讯和异步通讯1.2、同步调用存在的问题1.3、异步调用方案1.4、异步通信的缺点 1、同步和异步通讯 学习mq之前&#xff0c;就要先知道同步通讯和异步通讯的区别。 1.1、同步通讯和异步通讯 同步通讯就像是打电话&am…

【网络安全】漏洞挖掘入门教程(非常详细),小白是如何挖漏洞(技巧篇)0基础入门到精通!

温馨提示&#xff1a; 初学者最好不要上手就去搞漏洞挖掘&#xff0c;因为漏洞挖掘需要很多的系统基础知识和一些理论知识做铺垫&#xff0c;而且难度较大…… 较合理的途径应该从漏洞利用入手&#xff0c;不妨分析一些公开的CVE漏洞。很多漏洞都有比较好的资料&#xff0c;分…

Java开发人员不得不收集的代码,java软件开发面试常见问题

前言 今年的金三银四已经过去一大半了&#xff0c;在这其中参与过不少面试&#xff0c;2021都说工作不好找&#xff0c;这也是对开发人员的要求变向的提高了。 之前在Github上收获15Kstar的Java核心神技&#xff08;这参数&#xff0c;质量多高就不用我多说了吧&#xff09;非…

C++与 Fluke5500A设备通过GPIB-USB-B通信的经验积累

C与 Fluke5500A设备通过GPIB-USB-B通信的经验积累 以下内容来自&#xff1a;C与 Fluke5500A设备通过GPIB-USB-B通信的经验积累 - JMarcus - 博客园 (cnblogs.com)START 1.需要安装NI-488.2.281&#xff0c;安装好了之后&#xff0c;GPIB-USB-B的驱动就自动安装好了 注意版本…

13. C++类使用方式

【类】 C语言使用函数将程序代码模块化&#xff0c;C通过类将代码进一步模块化&#xff0c;类用于将实现一种功能的全局数据、以及操作这些数据的函数集中存储在一起&#xff0c;同时可以设置类成员的访问权限&#xff0c;禁止外部代码使用和篡改本类成员&#xff0c;类成员访…

SMT贴片加工——品质检验要求

一、元器件贴装工艺品质要求 1.元器件贴装需整齐、正中&#xff0c;无偏移、歪斜 2.贴装的元器件型号规格应正确&#xff1b;元器件应无漏贴、错贴 3.贴片元器件不允许有反贴 4.有极性要求的贴片器件安装需按正确的极性标示安装 二、元器件焊锡工艺要求 1.FPC板面应无影响…

Java实现读取转码写入ES构建检索PDF等文档全栈流程

背景 之前已简单使用ES及Kibana和在线转Base64工具实现了检索文档的demo&#xff0c;并已实现WebHook的搭建和触发流程接口。 传送门&#xff1a; 基于GitBucket的Hook构建ES检索PDF等文档全栈方案 使用ES检索PDF、word等文档快速开始 实现读取本地文件入库ES 总体思路&…

真空展|2024上海国际真空技术及设备展览会

2024上海国际真空技术及设备展览会 2024 Shanghai International Exhibition of vacuum technology and equipment 时 间&#xff1a;2024年7月13-15日 地 点&#xff1a;上海新国际博览中心 承办单位&#xff1a;上海昶文展览服务有限公司 展会简…

JVM内部世界(内存划分,类加载,垃圾回收)

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;JVM内部世界(内存划分,类加载,垃圾回收) 关于JVM的学习主要掌握三方面: JVM内存区的划分类加载垃圾回收 一.JVM内存区的划分 当一个Java进程开始执行时,JVM会首先向操作系统申…

CSS常见布局方式

一、静态布局&#xff08;Static Layout&#xff09; 既传统web设计 就是不管浏览器尺寸多少&#xff0c;网页布局就按当时写代码的布局来布置; 块级元素&#xff1a;每个块级元素会在上一个元素下面另起一行&#xff0c;他们会被设置好的margin分离。块级元素是垂直组织的。 …

SQL Server 安装部署

SQL Server是运行在win server上的关系型数据库&#xff0c;本文主要描述SQL Server的安装部署。 如上所示&#xff0c;SQL Server不同版本的定义以及特性 如上所示&#xff0c;SQL Server不同版本支持的容量规模 如上所示&#xff0c;SQL Server不同版本支持的高可用性 如上所…

能源大数据采集,为您提供专业数据采集服务

随着经济的不断发展&#xff0c;能源产业也逐渐成为国民经济的支柱产业之一。而对于能源行业来说&#xff0c;数据采集是一项至关重要的工作。以往&#xff0c;能源企业采集数据主要依靠人工收集、整理&#xff0c;但是这种方式不仅效率低下&#xff0c;而且容易出现数据不准确…

springcloud:3.7测试线程池服务隔离

服务提供者【test-provider8001】 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相关接口 测试远程调用&#xff1a;http://localhost:8001/payment/index 服务消费者【test-consumer-resilience4j8004】 Openfeign远程调用消费者搭建 文章地址http://t…