黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(5)登录认证

 指路(1)(2)(3)(4)👇

黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(1)准备工作、部门管理_tlias智能学习辅助系统的需求分析-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/YOYU_/article/details/135476566黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(2)员工管理|分页查询、分页查询(带条件)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/YOYU_/article/details/135491233黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(3)员工管理|新增员工、文件上传-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/YOYU_/article/details/135513546

黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(4)员工管理|修改员工、配置文件-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/YOYU_/article/details/135535512

一、登录功能

代码编写:

登录操作的核心逻辑就是按照用户名和密码查询数据库中的内容,如果有则登录成功,如果没有则返回错误信息。

结果展示:

前后端联调:

二、登录校验

1.会话技术

  • 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
  • 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据
  • 会话跟踪方案:
  1. 客户端会话跟踪技术:Cookie

    1. HTTP - 标题 | Headers - 开发者手册 - 腾讯云开发者社区-腾讯云 (tencent.com)
    2. 核心:响应头(Set-Cookie: name=value)设置Cookie的数据,请求头(Cookie:name=value)用来携带Cookie的数据。
    3. 优点:HTTP协议中支持的技术
    4. 缺点:
      1. 移动端APP无法使用Cookie;
      2. 不安全,用户可以自己禁用Cookie;
      3. Cookie不能跨域。(跨域区分三个维度:协议、IP/域名、端口号)
  2. 服务端会话跟踪技术:Session

    1. 底层:基于Cookie实现的
    2. 响应头(Set-Cookie: JSESSIONID=1)设置Cookie的数据,请求头(Cookie:JSESSIONID=1)用来携带Cookie的数据。
    3. 优点:存储在服务器,安全
    4. 缺点:
      1. 服务器集群环境下无法直接使用Session;
      2. Cookie的缺点。
  3. 令牌技术

    1. 缺点:需要自己实现
    2. 优点:
      1. 支持PC端、移动端;
      2. 解决集群环境下的认证问题;
      3. 减轻服务器存储压力。

2.JWT令牌

JWT:JSON Web Token

定义了一种简洁、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。

JSON Web Tokens - jwt.io

Base64 编码/解码 | 菜鸟工具 (runoob.com)

JWT令牌生成

//    生成JWT@Testpublic void testGenJwt(){Map<String, Object> claims = new HashMap<>();claims.put("id", 1);claims.put("name", "tom");String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, "itheima")//签名算法.setClaims(claims)//自定义内容(载荷).setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置有效期为一个小时.compact();System.out.println(jwt);}

JWT令牌解析

//    解析JWT@Testpublic void testParseJwt(){Claims claim = Jwts.parser().setSigningKey("itheima")//指定签名密钥.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTcwNTA3MjY3NH0.Yvw1YNjqip8ysiFnKavbaszCMo4zgqjFymwnK15nIJI").getBody();//解析令牌System.out.println(claim);}
}

结果展示:

前后端联调:

F12抓取数据

前端在后续的每一次请求都会携带令牌到服务端

3.过滤器Filter

  • 概念:是JavaWeb三大组件(Servlet, Filter, Listener)之一;
  • 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能;
  • 过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

Q:放行后访问对应资源,资源访问完成后,还会回到Filter中吗?会

       如果回到Filter中,是重新执行还是执行放行后的逻辑呢?执行放行后的逻辑

@ServletComponentScan:在启动类上增加该注解,引入Filter过滤器

代码展示:

package com.itheima.filter;import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.BoundSqlInterceptor;
import com.github.pagehelper.util.StringUtil;
import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** ClassName: LoginCheckFilter* Package: com.itheima.filter*/
@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//强转为httpHttpServletRequest req = (HttpServletRequest) request;HttpServletResponse resp = (HttpServletResponse) response;//1.获取请求urlString url = req.getRequestURL().toString();log.info("请求的url:{}", url);//2.判断请求url中是否包含login,如果包含,说明是登录操作,放行if (url.contains("login")){log.info("登录操作,放行……");chain.doFilter(request, response);return;}//3.获取请求头的令牌(token)String jwt = req.getHeader("token");//4.判断令牌是否存在,如果不存在,返回错误结果(未登录)if (!StringUtils.hasLength(jwt)){log.info("请求头token为空,返回未登录的信息");Result error = Result.error("NOT_LOGIN");//手动转换 对象--》json---》阿里巴巴fastJSON工具包String notlogin = JSONObject.toJSONString(error);resp.getWriter().write(notlogin);return;}//5.判断token,如果解析失败,返回错误结果(未登录)try {JwtUtils.parseJWT(jwt);} catch (Exception e) {//jwt令牌解析失败e.printStackTrace();log.info("解析令牌失败,返回未登录的错误信息");Result error = Result.error("NOT_LOGIN");//手动转换 对象--》json---》阿里巴巴fastJSON工具包String notlogin = JSONObject.toJSONString(error);resp.getWriter().write(notlogin);return;}//6.放行log.info("令牌合法,放行");chain.doFilter(request, response);}
}

拦截结果:

登录请求,直接放行

正确的jwt令牌,查询成功

错误的令牌,解析错误,返回json错误信息

4.拦截器Interceptor

  • 概念:是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截控制器方法的执行。
  • 作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。

【Filter与Interceptor区别】

  • 接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口;
  • 拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源;
  • 放行代码不同:Filter需要用调用doFilter方法,Interceptor只需要return true。

退出登录之后,直接复制部门管理链接是无法进入的,拦截需要再次登录。

三、异常处理

@RestControllerAdvice:在全局异常处理器上加

@ExceptionHandler:指定当前方法要捕获的是哪一类型的异常

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

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

相关文章

python学习笔记10(选择结构2、循环结构1)

&#xff08;一&#xff09;选择结构2 1、if……else……语句 #&#xff08;1&#xff09;基本格式 numbereval(input("请输入您的6位中奖号码&#xff1a;")) if number123456:print("恭喜您&#xff0c;中奖了") else:print("未中奖")#&…

2024美赛数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…

深度解析JVM类加载器与双亲委派模型

概述 Java虚拟机&#xff08;JVM&#xff09;是Java程序运行的核心&#xff0c;其中类加载器和双亲委派模型是JVM的重要组成部分。本文将深入讨论这两个概念&#xff0c;并解释它们在实际开发中的应用。 1. 什么是类加载器&#xff1f; 类加载器是JVM的一部分&#xff0c;负…

java-Lambda 语法总结

文章目录 Lambda 语法概览Lambda 表达式语法1.Lambda 表达式与函数接口2.Lambda 遇上 this final Lambda 语法概览 String(] names {”Justi n ”,”caterpillar”,”Bush " }; Arrays . sort (names, new Compara tor<String> () { publ int compare (String na…

pytorch12:GPU加速模型训练

目录 1、CPU与GPU2、数据迁移至GPU2.1 to函数使用方法 3、torch.cuda常用方法4、多GPU并行运算4.1 torch.nn.DataParallel4.2 torch.distributed加速并行训练 5、gpu总结 往期回顾 pytorch01&#xff1a;概念、张量操作、线性回归与逻辑回归 pytorch02&#xff1a;数据读取Data…

WordPress企业模板

首页大图wordpress外贸企业模板 橙色的wordpress企业模板 演示 https://www.zhanyes.com/waimao/6250.html

【算法Hot100系列】全排列

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

【学习iOS高质量开发】——熟悉Objective-C

文章目录 一、Objective-C的起源1.OC和其它面向对象语言2.OC和C语言3.要点 二、在类的头文件中尽量少引用其他头文件1.OC的文件2.向前声明的好处3.如何正确引入头文件4.要点 三、多用字面量语法&#xff0c;少用与之等价的方法1.何为字面量语法2.字面数值3.字面量数组4.字面量字…

vivado IP使用

使用IP源 注意&#xff1a;有关IP的更多信息&#xff0c;包括添加、打包、模拟和升级IP&#xff0c;请参阅VivadoDesign Suite用户指南&#xff1a;使用IP&#xff08;UG896&#xff09;进行设计。在Vivado IDE中&#xff0c;您可以在RTL项目中添加和管理以下类型的IP核心&…

高通sm7250与765G芯片是什么关系?(一百八十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

HTML--CSS--边框、列表、表格样式

边框样式 属性&#xff1a; border-width 边框宽度 border-style 边框外观 border-color 边框颜色 需要同时设定三个属性 border-width 边框宽度 取值为像素值 border-style 边框样式 none 无样式 dashed 虚线 solid 实线 border-color 边框颜色 如示例&#xff1a; 为div设…

Spring Boot框架中Controller层API接口如何支持使用多个@RequestBody注解接受请求体参数

一、前言 众所周知&#xff0c;在Spring Boot框架中&#xff0c;Controller层API接口编码获取请求体参数时&#xff0c;在参数上会使用RequestBody注解&#xff1b;如果一次请求中&#xff0c;请求体参数携带的内容需要用多个参数接收时&#xff0c;能不能多次使用RequestBody…

跟我学java|Stream流式编程——并行流

什么是并行流 并行流是 Java 8 Stream API 中的一个特性。它可以将一个流的操作在多个线程上并行执行&#xff0c;以提高处理大量数据时的性能。 在传统的顺序流中&#xff0c;所有的操作都是在单个线程上按照顺序执行的。而并行流则会将流的元素分成多个小块&#xff0c;并在多…

微信小程序 全局配置||微信小程序 页面配置||微信小程序 sitemap配置

全局配置 小程序根目录下的 app.json 文件用来对微信小程序进行全局配置&#xff0c;决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等。 以下是一个包含了部分常用配置选项的 app.json &#xff1a; {"pages": ["pages/index/index",&q…

十五.流程控制与游标

流程控制与游标 1.流程控制1.1分支结构之IF1.2分支结构值CASE1.3循环结构之LOOP1.4循环结构之WHILE1.5循环结构之REPEAT1.6跳转语句之LEAVE语句1.7跳转语句之ITERATE语句 2.游标2.1什么是游标2.2使用游标步骤4.3举例4.5小结 1.流程控制 解决复杂问题不可能通过一个 SQL 语句完…

C# Winform翻牌子记忆小游戏

效果 源码 新建一个winform项目命名为Matching Game&#xff0c;选用.net core 6框架 并把Form1.cs代码修改为 using Timer System.Windows.Forms.Timer;namespace Matching_Game {public partial class Form1 : Form{private const int row 4;private const int col 4;p…

简单介绍JDK、JRE、JVM三者区别

简单介绍JDK vs JRE vs JVM三者区别 文编|JavaBuild 哈喽&#xff0c;大家好呀&#xff01;我是JavaBuild&#xff0c;以后可以喊我鸟哥&#xff0c;嘿嘿&#xff01;俺滴座右铭是不在沉默中爆发&#xff0c;就在沉默中灭亡&#xff0c;一起加油学习&#xff0c;珍惜现在来之不…

【samba】Ubuntu20.04安装 error255解决方法

目录 使用samba报错 net usershare returned error 255时&#xff08;如下图&#xff09;解决方法如下&#xff1a; 1、安装 Samba 服务&#xff1a; 2、配置 Samba 共享&#xff1a; 3、设置 Samba 用户密码&#xff1a; 4、重启 Samba 服务&#xff1a; 6、在 Windows 上…

mysql 下载和安装和修改MYSQL8.0 数据库存储文件的路径

一、第一步:下载步骤 下载链接&#xff1a;MySQL :: Download MySQL Installer 选择版本8.0.35&#xff0c;社区版&#xff0c; 点击 Download 下载 安装包 二、第二步:安装步骤 添加环境变量&#xff0c;C:\Program Files\MySQL\MySQL Server 8.0\bin 可以点开MySQL 8.0 Co…

C++基础1

一、形参带默认值的函数 二、inline内联函数 内联函数是一种在编译器处理时&#xff0c;将函数的实际代码插入到调用处的方法。通常&#xff0c;函数调用涉及一定的开销&#xff0c;包括保存和恢复调用现场、跳转到函数的代码位置等。而内联函数通过在调用处直接插入函数的代码…