SpringBoot企业级开发之【用户模块-登录】

开发之前我们先看一下接口文档的要求:

开发思路:

开发实操:

因为我们之前开发注册的时候,就有了一些相关的操作,所以在这里我们只需要定义登录的controller即可:

 //用户登录@PostMapping("/login")public Result login(@Pattern(regexp = "^\\S{5,16}$")String username,@Pattern(regexp = "^\\S{5,16}$") String password) {//根据用户名查询用户User loginUser = userService.findUserByUsername(username);//判断用户是否存在if(loginUser == null){return Result.error("用户不存在");}//判断密码是否正确//因为之前是加密后存储的密码,所以我们也应该加密后再判断是否相同if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){//登录成功return Result.success("jwt token 令牌");}return Result.error("密码错误");}

测试:

我们将密码打错:

我们将密码打对:

认证登录【重点】:

为什么会有登录认证呢?

因为你登录用户之后会有很多的对应的操作接口,那么你不登录就无法使用到这些接口,所以,我们就会有“登录认证”,首先我们会借助令牌这个东西去校验我们的登录是否合理.....

令牌:

令牌是什么:

令牌的作用:

意思就是通过令牌才能够去访问登陆后的所有资源

JWT令牌:

我们这里使用JWT令牌(由“头”、“有效载荷”、“签名”)

JWT令牌具体有生成步骤和验证步骤:

生成令牌:
 
引入坐标:
  <!--JWT令牌坐标--><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.4.0</version></dependency><!--单元测试依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

测试类中测试:
package org.huangyingyuan;import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import java.util.Date; 
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;//测试生成的JWT令牌
public class JwtTest {@Testpublic void test() {Map<String, Object> claims = new HashMap<>();claims.put("id", 1);claims.put("username","张三");//生成jwt的代码String token = JWT.create().withClaim("user",claims)//添加载荷.withExpiresAt(new Date(System.currentTimeMillis() + 1000*60*60*12))//设置过期时间(为12小时).sign(Algorithm.HMAC256("huangyingyuan"));//指定算法,配置秘钥System.out.println(token);}
}

测试结果为:

验证令牌:
 
在测试类中测试:
    //验证jwt令牌@Testpublic void testParse(){//定义字符串token,模拟用户传过来的tokenString token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" +".eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6IuW8oOS4iSJ9LCJleHAiOjE3NDMzNTc5NTB9" +".ipTTySrl3HwtkmcqUfMyp_os_M9cJIqa2kG01qNPYxo";JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("huangyingyuan")).build();  //构建验证器DecodedJWT decodedJWT = jwtVerifier.verify(token);  //验证tokenMap<String, Claim>claims=decodedJWT.getClaims();  //获取载荷System.out.println(claims.get("user"));}

测试的结果如下:

几种测试失败的可能:

1.篡改了头部和载荷部分的数据,那么验证失败

2.密钥改了,验证失败

3.token设置的时间过期

正片开始:

生成JWT令牌:

1.导入Jwt的Util的工具类

省略

2.在controller类下去生成token,返回数据
//用户登录@PostMapping("/login")public Result login(@Pattern(regexp = "^\\S{5,16}$")String username,@Pattern(regexp = "^\\S{5,16}$") String password) {//根据用户名查询用户User loginUser = userService.findUserByUsername(username);//判断用户是否存在if(loginUser == null){return Result.error("用户不存在");}//判断密码是否正确//因为之前是加密后存储的密码,所以我们也应该加密后再判断是否相同if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){//生成token(JWT令牌)Map<String, Object>claims=new HashMap<String, Object>();claims.put("id",loginUser.getId());claims.put("username",loginUser.getUsername());JwtUtil.genToken(claims);String token = JwtUtil.genToken(claims);//登录成功return Result.success(token);}return Result.error("密码错误");}
3.测试

验证JWT令牌:
 

我们先看一下接口文档的要求:

需要在请求头获取令牌,并定义了请求头名的是什么

若错误,定义响应码为401

拦截器:

设置拦截器后的登录验证流程:

注意!

1.@RequestHeader("Authorization")设置请求头

2.传入HttpServletResponse参数,提供响应码

package org.huangyingyuan.controller;import jakarta.servlet.http.HttpServletResponse;
import org.huangyingyuan.pojo.Result;
import org.huangyingyuan.utils.JwtUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Map;//模拟在用户登陆后才能使用的功能(在学习JWT令牌的作用)
@RestController
@RequestMapping("/article")
public class ArticleController {@GetMapping("/list")public Result<String> list(@RequestHeader("Authorization") String token, HttpServletResponse response) {//如果接受成功则解析token,失败则修改状态码为401try{//模拟token验证Map<String, Object> claims = JwtUtil.parseToken(token);return Result.success("所有的文章数据....");}catch (Exception e){//http响应状态码为401response.setStatus(401);return Result.error("未登录");}}
}

我们在测试接口的时候,要注意先登录,然后复制令牌过来后,设置Heager请求头再加入value的值为令牌,再发送数据请求即可登录使用成功

多功能:

咱们前面是登陆后的一个功能,那么登陆后有多个功能呢?怎么办?

答案是 使用拦截器:

使用拦截器后:

我们使用了拦截器的话,就不用controller类下的拦截了,要注释掉这些拦截功能

编写拦截器接口:

创建一个interceptors拦截器包,下创建一个LoginInterceptor类,编写关于登录的拦截器:

package org.huangyingyuan.interceptors;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.huangyingyuan.pojo.Result;
import org.huangyingyuan.utils.JwtUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import java.util.Map;//拦截器(登录拦截器)@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//令牌验证String token =request.getHeader("Autorization");//验证tokentry{//模拟token验证Map<String, Object> claims = JwtUtil.parseToken(token);//放行return true;}catch (Exception e){//http响应状态码为401response.setStatus(401);//不放行return false;}}
}
注册拦截器接口:
 

在config包下,创建一个WebConfig类【注册拦截器】:

package org.huangyingyuan.config;import org.huangyingyuan.interceptors.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//登录接口(/user/login)和注册类接口(/user/register)不拦截registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login", "/user/register");}
}

结果:

1.没勾选令牌参数配置:

2.勾选了令牌配置:

这样子就实现了“验证令牌headers”的相关操作,实现了多页面跳转的拦截器操作!

干货满满,点个关注,下期更精彩

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 8.0.27-docker

安装 可以略过本步 https://dev.mysql.com/downloads/https://dev.mysql.com/downloads/ 镜像查询与安装 先查询&#xff1a; docker search mysql 明显会报错 Error response from daemon: Get "https://index.docker.io/v1/search?qmysql&n25": dial tcp…

Pgvector的安装

Pgvector的安装 向量化数据的存储&#xff0c;可以为 PostgreSQL 安装 vector 扩展来存储向量化数据 注意&#xff1a;在安装vector扩展之前&#xff0c;请先安装Postgres数据库 vector 扩展的步骤 1、下载vs_BuildTools 下载地址&#xff1a; https://visualstudio.microso…

Python高阶函数-sorted(深度解析从原理到实战)

一、sorted()函数概述 sorted()是Python内置的高阶函数&#xff0c;用于对可迭代对象进行排序操作。与列表的sort()方法不同&#xff0c;sorted()会返回一个新的已排序列表&#xff0c;而不改变原数据。 基本语法 sorted(iterable, *, keyNone, reverseFalse)二、核心参数详…

ArcGIS Pro/GeoScene Pro AI 助手 2.1

引言 面对ArcGIS Pro/GeoScene Pro复杂的操作界面和脚本开发需求&#xff0c;你是否还在为功能定位、代码调试和效率优化而烦恼&#xff1f;今天&#xff0c;推出自制的Pro AI助手2.0版本&#xff0c;七大核心功能将革新你的GIS工作方式&#xff01;无论是界面操作指引、一键生…

如何将本地更改的README文件同步到自己的GitHub项目仓库

如何将本地更改的 README 文件同步到 GitHub 仓库 在你 git clone 下来的工程目录下&#xff1a; 先使用 robocopy YOUR\SOURCE\CODE\DIR YOUR\GIT\CLONE\DIR /E /XD .git /DCOPY:T 将你的更改Copy到你git下来的工程中&#xff08;上面的命令会自动处理&#xff0c;例如只会C…

PostIn V1.0.8版本发布,IDEA 插件支持一键扫描上报,让接口定义不再繁琐

PostIn是一款国产开源免费的接口管理工具&#xff0c;包含项目管理、接口调试、接口文档设计、接口数据MOCK等模块&#xff0c;支持常见的HTTP协议、websocket协议等&#xff0c;支持免登陆本地接口调试&#xff0c;同时可以对项目进行灵活的成员权限、消息通知管理等。本周Pos…

UE5学习笔记 FPS游戏制作36 UI动画

文章目录 目的效果创建动画UI准备制作动画 播放动画目的效果创建动画UI准备制作动画 播放动画注册播放事件 目的效果 我们要创建一个提示动画&#xff0c;文字先渐显&#xff0c;然后向上移动&#xff0c;同时渐隐 创建动画 UI准备 创建一个UI控件&#xff0c;然后创建一个…

HTTP 响应头 Strict-Transport-Security 缺失漏洞

HTTP 响应头 Strict-Transport-Security 缺失漏洞 这个漏洞就是说明网站的HTTP响应头中没有设置Strict-Transport-Security&#xff0c;没有设置则可以通过将https自己手动改成htttp的方式进行访问。不安全 解决方法 1.nginx配置 nginx中增加如下配置&#xff1a; location / …

代理模式的优缺点是什么?

什么是代理模式&#xff1f; 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过创建代理对象来控制对原始对象的访问。 这种模式在前端开发中广泛应用&#xff0c;特别是在需要控制对象访问、添加额外逻辑或优化性能的场景中。 ​​核心…

【嵌入式学习3】UDP发送端、接收端

目录 1、发送端 2、接收端 3、UDP广播 1、发送端 from socket import *udp_socket socket(AF_INET,SOCK_DGRAM) udp_socket.bind(("127.0.0.1",3333))data_str "UDP发送端数据" data_bytes data_str.encode("utf-8") udp_socket.sendto(d…

AI重构SEO关键词精准布局

内容概要 在传统SEO策略面临搜索场景碎片化、用户意图复杂化的挑战下&#xff0c;AI技术通过多维数据分析与算法建模&#xff0c;正在重构关键词布局的逻辑框架。基于自然语言处理&#xff08;NLP&#xff09;的语义分析能力&#xff0c;AI可精准识别搜索词背后的需求层级&…

谷歌发布网络安全AI新模型Sec-Gemini v1

谷歌近日宣布推出实验性AI模型Sec-Gemini v1&#xff0c;旨在通过人工智能技术革新网络安全防御体系。该模型由Sec-Gemini团队成员Elie Burzstein和Marianna Tishchenko共同研发&#xff0c;旨在帮助网络安全人员应对日益复杂的网络威胁。 攻防不对称的破局之道 Sec-Gemini团队…

IntelliJ IDEA下开发FPGA——FPGA开发体验提升__下

前言 由于Quartus写代码比较费劲&#xff0c;虽然新版已经有了代码补全&#xff0c;但体验上还有所欠缺。于是使用VS Code开发&#xff0c;效果如下所示&#xff0c;代码样式和基本的代码补全已经可以满足开发&#xff0c;其余工作则交由Quartus完成 但VS Code的自带的git功能&…

Python语言的需求分析

Python语言的需求分析 引言 在信息技术快速发展的今天&#xff0c;编程语言的选择对于软件开发的成功与否起着至关重要的作用。Python作为一种高级编程语言&#xff0c;以其简洁易读的语法和强大的功能受到越来越多开发者的青睐。通过对Python语言的需求分析&#xff0c;我们…

抓wifi无线空口包之Ubuntu抓包(二)

一、设置网卡信道和频段&#xff0c;并抓包 1、使用iwconfig查看自己机器的无线网卡名称 wangwang-ThinkCentre-M930t-N000:~$ iwconfig lo no wireless extensions. eno1 no wireless extensions. enxc8a3624ab329 no wireless extensions. wlx90de80d1b5b1 IE…

深度学习实战电力设备缺陷检测

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对电力设备缺陷数据集进行训练和优化&#xff0c;该数据集包含丰富的电力设备缺…

Day1:前端项目uni-app壁纸实战

uni-app官网下载HBuilder。 uni-app快速上手 | uni-app官网 点击HBuilder 安装 新建项目 工具——插件安装 安装uni-app&#xff08;vue3&#xff09; 我们先来准备一下&#xff1a; 先在wallpaper下新建目录 我已经建过了 同样&#xff0c;再在common下建images和style目录&…

mac命令操作

mac命令操作 快速删除一行&#xff1a; control u 剪切文件&#xff1a;步骤1、先进行Command c 进行选择复制文件&#xff0c;2、进行commandoptionv进行移动文件&#xff0c;如果commandv是进行复制文件。 commandcontrolD 三个键即可屏幕取词进行翻译 mac中可以使用快捷方…

C#语言的加密货币

C#语言与加密货币&#xff1a;一个开发者的探索之旅 引言 随着区块链技术的迅猛发展&#xff0c;加密货币的应用已经渗透到我们生活的方方面面。作为一种新兴的数字资产&#xff0c;加密货币不仅改变了传统的投资方式&#xff0c;而且对全球经济产生了深远影响。其中&#xf…

Mysql 概念

MySQL 是一种 关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它使用 结构化查询语言&#xff08;SQL&#xff09; 来管理和操作数据。它最初由瑞典公司 MySQL AB 开发&#xff0c;后来被 Sun Microsystems 收购&#xff0c;现在属于 Oracle 公司。 一、MySQL…