SpringBoot速成(八)登录实战:未登录不能访问 P5-P8

1.登录 

package com.itheima.springbootconfigfile.controller;import com.itheima.springbootconfigfile.pojo.Result;
import com.itheima.springbootconfigfile.pojo.User;
import com.itheima.springbootconfigfile.service.UserService;import com.itheima.springbootconfigfile.utils.MailUtil1;
import jakarta.validation.constraints.Pattern;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/user")
@Validated
public class UserController {@Autowiredprivate UserService userService;//    public User findById(Integer id){
//        return userService.findById(id);
//    }//注册@GetMapping("/register")public Result register(@Pattern(regexp="^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}$") String password){//参数校验
//
//        if(username!=null&&username.length()>=5&&username.length()<=16&&
//                password!=null&&password.length()>=5&&password.length()<=16
//        ){//用户名是否存在User user=userService.findByUserName(username);if(user==null){//不存在则注册userService.register(username,password);return Result.success();//输出操作成功} else{//若已存在return Result.error("用户名已占用");}//参数校验
//    }else{
//        return  Result.error("参数不合法");
//
//        }}@GetMapping("/login")//登录public  Result<String> login(@Pattern(regexp="^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}$") String password){//根据用户名查询用户User loginuser=userService.findByUserName(username);//判断用户名是否存在if(loginuser==null){return  Result.error("用户名错误");}//用户名存在,判断密码是否正确:输入的用户名的密码是否与密文密码匹配if(MailUtil1.getMD5String(password).equals(loginuser.getPassword())){return  Result.success("jwt token令牌");}return  Result.error("密码错误");}
}

未登录(即无token,无header),却能访问:


->2.最常用的令牌Token(Token:要求防篡改):

JWT:用于WEB,基于Json的令牌

格式

header头(alg:签名算法,type:令牌类型JWT)          .              payload有效载荷(id,username)(不能有password等私密数据,因为这里边用的加密方式是公开的)=           .               signature签名(防止Token被篡改,确保安全,将header,paload加入指定密钥,通过指定签名算法技算得到)

代码展示:

1.JWT生成

<!--java-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>-->
package com.itheima;import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import org.junit.jupiter.api.Test;import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class JwtTest {@Testpublic void testGen(){Map<String,Object> claims=new HashMap<>();claims.put("id",1);claims.put("username","张三");//生成jwtString token=JWT.create().withClaim("user",claims).withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*12)).sign(Algorithm.HMAC256("itheima"));//添加载荷,过期时间:12h,指定算法和密钥System.out.println(token);}
}

2.JWT验证 
package com.itheima;import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.junit.jupiter.api.Test;import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class JwtTest {//JWT生成@Testpublic void testGen(){Map<String,Object> claims=new HashMap<>();claims.put("id",1);claims.put("username","张三");//生成jwtString token=JWT.create().withClaim("user",claims).withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*24)).sign(Algorithm.HMAC256("itheima"));//添加载荷,过期时间:12h,指定算法和密钥System.out.println(token);}//JWT验证@Testpublic void testParse(){//将user传过来的token,定义为tokenString token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" +".eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6IuW8oOS4iSJ9LCJleHAiOjE3MzkxODY0NzR9" +".xSK7L5wUpvbYcxGsloRuZA1arBez87cpv2K0s_odk00";//生成验证器JWTVerifier jwtVerifier=JWT.require(Algorithm.HMAC256("itheima")).build();//验证token,生成解析后的JWT对象DecodedJWT decodedJWT=jwtVerifier.verify(token);Map<String, Claim> claimMap=decodedJWT.getClaims();System.out.println(claimMap.get("user"));//如果能输出user的id,username,说明根据该token 解析成功}}
报错:

修改:

重新生成token,并修改验证方法中的token,再次运行,成功!


举例:若修改载荷,则token失效,时间过期,密钥错误都会失效


3.登录认证(登录时生成token->验证token,错误:401)

1.普通:

 @GetMapping("/login")//登录public  Result<String> login(@Pattern(regexp="^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}$") String password){//根据用户名查询用户User loginuser=userService.findByUserName(username);//判断用户名是否存在if(loginuser==null){return  Result.error("用户名错误");}//用户名存在,判断密码是否正确:输入的用户名的密码是否与密文密码匹配if(MailUtil1.getMD5String(password).equals(loginuser.getPassword())){Map<String,Object> claims=new HashMap<>();claims.put("id",loginuser.getId());claims.put("username",loginuser.getUsername());String token= JwtUtil.genToken(claims);//以上是为了把JwtTest没有的补充完,然后调用genToken()return  Result.success(token);}return Result.error("密码错误");}

?????????????????猜测:到这一步仅仅是生成token.还没写验证token


2.拦截器:

1.生成拦截器 

1.目的:会有很多Controller,都要进行某一步时,选择拦截器:HandlerInterceptor接口用于拦截处理器(Controller方法)的执行 

生成token已经有了(在每个Controller中),现在进行token验证

2.运行顺序:搜索/artical/list时,未登录情况下会调用拦截器:先经过WebConfig,再调用拦截器LoginInterceptor,若失败则返回401,若成功则返回ArticalController中的

return  Result.success("所有的文章数据");

ArticalController: 

package com.itheima.springbootconfigfile.controller;import com.itheima.springbootconfigfile.pojo.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/artical")
public class ArticalController {@GetMapping("/list")public Result<String> list(){return  Result.success("所有的文章数据");}
}

 

package com.itheima.springbootconfigfile.interceptors;import com.itheima.springbootconfigfile.utils.JwtUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import java.util.Map;@Component
public class LoginInterceptor implements HandlerInterceptor {//token验证@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//得到tokenString token=request.getHeader("Authorization");//验证tokentry {Map<String,Object> claims= JwtUtil.parseToken(token);return true;}catch (Exception e){response.setStatus(401);return false;}}
}

request:请求, 从请求头中获取Authorization来获取token

response:响应,设置HTTP响应状态码是401

2.注册该拦截器:

package com.itheima.springbootconfigfile.config;import com.itheima.springbootconfigfile.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) {//登录,注册:不拦截registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/register","/user/login");}
}

运行: 

有Authorization(即有token)->success:

无->error

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

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

相关文章

对接DeepSeek

其实&#xff0c;整个对接过程很简单&#xff0c;就四步&#xff0c;获取key&#xff0c;找到接口文档&#xff0c;接口测试&#xff0c;代码对接。 获取 KEY https://platform.deepseek.com/transactions 直接付款就是了&#xff08;现在官网暂停充值2025年2月7日&#xff0…

ASP.NET Core JWT

目录 Session的缺点 JWT&#xff08;Json Web Token&#xff09; 优点&#xff1a; 登录流程 JWT的基本使用 生成JWT 解码JWT 用JwtSecurityTokenHandler对JWT解码 注意 Session的缺点 对于分布式集群环境&#xff0c;Session数据保存在服务器内存中就不合适了&#…

【MySQL】深度学习数据库开发技术:使用CC++语言访问数据库

**前言&#xff1a;**本节内容介绍使用C/C访问数据库&#xff0c; 包括对数据库的增删查改操作。 主要是学习一些接口的调用&#xff0c; 废话不多说&#xff0c; 开始我们的学习吧&#xff01; ps:本节内容比较容易&#xff0c; 友友们放心观看哦&#xff01; 目录 准备mysql…

postgreSQL16.6源码安装

1.获取源码 从PostgreSQL: File Browser获取tar.bz2或者tar.gz源码 2.解压 tar xf postgresql-version.tar.bz2 roothwz-VMware-Virtual-Platform:/usr/local# tar xf postgresql-16.6.tar.bz2 roothwz-VMware-Virtual-Platform:/usr/local# ll 总计 24324 drwxr-xr-x 12 ro…

音频进阶学习十一——离散傅里叶级数DFS

文章目录 前言一、傅里叶级数1.定义2.周期信号序列3.表达式DFSIDFS参数含义 4.DFS公式解析1&#xff09;右边解析 T T T、 f f f、 ω \omega ω的关系求和公式N的释义求和公式K的释义 e j ( − 2 π k n N ) e^{j(\frac{-2\pi kn}{N})} ej(N−2πkn​)的释义 ∑ n 0 N − 1 e…

【kafka系列】Topic 与 Partition

Kafka 的 Topic&#xff08;主题&#xff09; 和 Partition&#xff08;分区&#xff09; 是数据组织的核心概念&#xff0c;它们的映射关系及在 Broker 上的分布直接影响 Kafka 的性能、扩展性和容错能力。以下是详细解析&#xff1a; 一、Topic 与 Partition 的映射关系 Top…

卷积神经网络CNN如何处理语音信号

卷积神经网络&#xff08;CNN&#xff09;在处理语音数据时通常不直接处理原始的一维波形信号&#xff0c;而是处理经过预处理的二维语音特征图。以下是CNN处理语音数据时的常见数据类型和步骤&#xff1a; 1. 语音信号预处理 语音信号通常是一维的时间序列&#xff08;波形信…

【MQ】Spring3 中 RabbitMQ 的使用与常见场景

一、初识 MQ 传统的单体架构&#xff0c;分布式架构的同步调用里&#xff0c;无论是方法调用&#xff0c;还是 OpenFeign 难免会有以下问题&#xff1a; 扩展性差&#xff08;高耦合&#xff0c;需要依赖对应的服务&#xff0c;同样的事件&#xff0c;不断有新需求&#xff0…

GB/T 43698-2024 《网络安全技术 软件供应链安全要求》标准解读

一、43698-2024标准图解 https://mmbiz.qpic.cn/sz_mmbiz_png/rwcfRwCticvgeBPR8TWIPywUP8nGp4IMFwwrxAHMZ9Enfp3wibNxnfichT5zs7rh2FxTZWMxz0je9TZSqQ0lNZ7lQ/640?wx_fmtpng&fromappmsg 标准在线预览&#xff1a; 国家标准|GB/T 43698-2024 相关标准&#xff1a; &a…

Linux系统-centos防火墙firewalld详解

Linux系统-centos7.6 防火墙firewalld详解 1 firewalld了解 CentOS 7.6默认的防火墙管理工具是firewalld&#xff0c;它取代了之前的iptables防火墙。firewalld属于典型的包过滤防火墙或称之为网络层防火墙&#xff0c;与iptables一样&#xff0c;都是用来管理防火墙的工具&a…

Gitlab中如何进行仓库迁移

需求&#xff1a;之前有一个自己维护的新仓库A&#xff0c;现在需要将这个仓库提交并覆盖另一个旧的仓库B&#xff0c;需要保留A中所有的commit信息。 1.方法一&#xff1a;将原有仓库A导出后再导入到新的仓库B中 适用场景&#xff1a;新的仓库B是一个待建仓库&#xff0c;相当…

微信点餐系统小程序ssm+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

01单片机上电后没有正常运行怎么办

单片机上电后没有运转, 首先要检查什么? 1、单片机供电是否正常? &电路焊接检查 如果连最基本的供电都没有,其它都是空谈啊!检查电路断路了没有?短路了没有?电源合适吗?有没有虚焊? 拿起万用表之前,预想一下测量哪里?供电电压应该是多少?对PCB上电压测量点要…

【Java基础】为什么不支持多重继承?方法重载和方法重写之间区别、Exception 和 Error 区别?

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;Java基础面经 &#x1f4da;本系列文章为个…

c++ haru生成pdf输出饼图

#define PI 3.14159265358979323846 // 绘制饼图的函数 void draw_pie_chart(HPDF_Doc pdf, HPDF_Page page, float *data, int data_count, float x, float y, float radius) { float total 0; int i; // 计算数据总和 for (i 0; i < data_count; i) { tot…

Linux 创建进程 fork()、vfork() 与进程管理

Linux 创建进程 fork、vfork、进程管理 一、Linux的0号、1号、2号进程二、Linux的进程标识三、fork() 函数1、基本概念2、函数特点3、用法以及应用场景&#xff08;1&#xff09;父子进程执行不同的代码&#xff08;2&#xff09;进程执行另一个程序 4、工作原理 四、vfork() 函…

【漫话机器学习系列】082.岭回归(或脊回归)中的α值(alpha in ridge regression)

岭回归&#xff08;Ridge Regression&#xff09;中的 α 值 岭回归&#xff08;Ridge Regression&#xff09;是一种 带有 L2​ 正则化 的线性回归方法&#xff0c;用于处理多重共线性&#xff08;Multicollinearity&#xff09;问题&#xff0c;提高模型的泛化能力。其中&am…

电脑重启后vscode快捷方式失效,找不到code.exe

今天打开电脑发现vscode的快捷方式失效了&#xff0c;提示code.exe被删除或移动。 解决方法 查看vscode安装目录&#xff0c;发现多了一个_文件夹&#xff0c;包括code.exe在内的其他文件都被移动到了这个文件夹下。 将里面内容都移动到microsoft vs code文件夹下&#xff0c…

[权限提升] Linux 提权 维持 — 系统错误配置提权 - Sudo 滥用提权

关注这个专栏的其他相关笔记&#xff1a;[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01&#xff1a;Sudo 滥用提权原理 Sudo 是一个 Linux 系统管理命令&#xff0c;它允许系统管理员授予普通用户以指定身份执行指定命令的权限。该命令不仅减少了 Root 用户的登录时间和管理时…

激活函数篇 04 —— softmax函数

将模型的输出转换为概率分布&#xff0c;使得模型能够输出每个类别的概率值。 Softmax ( a i ) e a i ∑ j 1 n e a j \text{Softmax}(a_i)\frac{e^{a_i}}{\sum_{j1}^n e^{a_j}} Softmax(ai​)∑j1n​eaj​eai​​ 其中&#xff0c; a i a_i ai​ 是输入向量中的第 i i i 个…