黑马程序员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
    @Test
    public 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
    @Test
    public 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 {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //强转为http
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        //1.获取请求url
        String 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:指定当前方法要捕获的是哪一类型的异常

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

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

相关文章

外汇天眼:模拟大赛报名人数突破一万大关

&#x1f525;&#x1f525;&#x1f525; 第二届模拟交易世界杯模拟交易赛区&#xff1a;截止到2024年1月15日上午9:58:06 报名人数已突破10000大关&#xff0c;累计模拟交易人数突破6800&#xff0c;日均模拟交易人数达1100&#xff0c;累计模拟交易金额超650亿&#xff0c;…

YOLOV7剪枝流程

YOLOV7剪枝流程 1、训练 1&#xff09;划分数据集进行训练前的准备&#xff0c;按正常的划分流程即可 2&#xff09;修改train.py文件 第一次处在参数列表里添加剪枝的参数&#xff0c;正常训练时设置为False&#xff0c;剪枝后微调时设置为True parser.add_argument(--pr…

HCIP的静态路由复习

VRP设置用户名密码登录 [R1]aaa [R1-aaa]local-user TMG password cipher huawei #创建一个名TMG的用户&#xff0c;密码huawei Info: Add a new user.[R1-aaa]local-user TMG privilege level 15 #设置权限 [R1-aaa]local-user TMG service-type terminal …

CentOS离线安装MongoDB

目录 1、下载 2、上传并解压 3、创建目录 4、新建配置文件 5、启动 6、验证 7、停止服务 7.1 快速停止 7.2 标准的关闭方法 1、下载 下载MongoDB对应的压缩包&#xff0c;本次使用的是4.0.10版本&#xff0c;点击下载 2、上传并解压 把压缩包上传到服务器&#xff0c…

人大金仓参与起草《数据库运维管理能力成熟度模型》标准

近日&#xff0c;由中国信息通信研究院、中国移动通信集团有限公司、人大金仓等单位参与起草的《数据库运维管理能力成熟度模型》标准正式发布。本标准适用于金融、电信、互联网、能源等重点行业对内部数据库运维管理能力进行全面综合的评价。 数据库作为基础软件的核心组成部分…

2024年初会报名照片要求(必须白底哦)

24初级会计报名照片要求 近期彩色标准1寸、(白色背景)&#xff0c; jpg格式&#xff0c;大于10KB ,像素>295*413. 初级会计考试报名照片要求为本人近期正面、免冠、清晰完整的证件电子照。 初级会计报名照片应显示报考人员双肩、双耳、双眉&#xff0c;不得佩戴首饰&#xf…

Android aar包集成与报错

Android Studio引用AAR的方式&#xff0c;分为gradle7.0之前与7.0之后 一、集成步骤 方法一&#xff1a; 1.将对应的xxx.aar包复制到项目的libs目录下&#xff08;xxx代表需要引入的aar包名称&#xff09; 2.然后在模块的build.gradle文件中配置implementation files(libs/lib…

geopandas 笔记:plot 的scheme

transbigdata 笔记&#xff1a;官方文档案例1&#xff08;出租车GPS数据处理&#xff09;-CSDN博客 3.3.1 节的内容的拓展&#xff0c;这里主要是比较各个scheme的效果 主代码为&#xff1a;修改的就是第二行scheme的内容 plt.figure(1,(16, 6), dpi300) schemebox_plot #图…

在线协作白板WBO本地部署启动并结合内网穿透实现远程协同办公

文章目录 推荐前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击…

Overleaf IEEE白嫖即将失效!

之前白嫖Overleaf用IEEE的&#xff0c;最长只能到一月份了&#xff01;&#xff08;官方回复&#xff09; 翻译一下&#xff1a; IEEE不支持这种Collaboratec白嫖了已经白嫖的&#xff0c;到2024年1月份过期没有白嫖的&#xff0c;已经无法获得了

大模型日报-20240115

即插即用&#xff0c;完美兼容&#xff1a;SD社区的图生视频插件I2V-Adapter来了 https://mp.weixin.qq.com/s/tlOWaMi0e6By__MUT414xA 图像到视频生成&#xff08;I2V&#xff09;任务旨在将静态图像转化为动态视频&#xff0c;这是计算机视觉领域的一大挑战。其难点在于从单…

opencv-py-基础操作

文章目录 阈值分割灰度图效果 二值化效果 二值化取反效果 截取效果 TOZERO效果 TOZERO取反效果 滤波均值滤波高斯滤波中值滤波 图像拼接简单的横向和纵向拼接效果&#xff08;三幅图片分别是均值滤波&#xff0c;高斯滤波&#xff0c;中值滤波&#xff09; 腐蚀与膨胀 阈值分割…

软件测试|使用holidays模块处理节假日

前言 在Python中&#xff0c;有一个名为 holidays 的模块&#xff0c;它可以帮助你轻松地处理节假日信息。该模块提供了一种方便的方式来确定特定日期是否是一个节假日&#xff0c;同时还支持不同国家和地区的节假日计算。本文将详细介绍如何使用 holidays 模块&#xff0c;包…

《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)

目录 开头语内存飙升问题分析与案例问题背景&#xff1a;我华为云的一个服务器运行我的一个项目“csdn-automatic-triplet-0.0.1-SNAPSHOT.jar”&#xff0c;由于只是用来测试的服务器&#xff0c;只有2G&#xff0c;所以分配给堆的内存1024M查询内存使用&#xff08;top指令&a…

3月济南|2024生物发酵系列展,不容错过的行业盛宴

2024生物技术产业装备展暨生物发酵系列展&#xff0c;由中国生物发酵产业协会主办&#xff0c;上海信世展览服务有限公司承办&#xff0c;于2024年3月5-7日在山东国际会展中心隆重举行。作为生物发酵产业具有专业性和权威性的行业盛会&#xff0c;期待携手继续共同前行&#xf…

德思特干货|德思特ADC/DAC静态参数测试系列(一)——什么是ADC转换点

在现代电子系统设计与高速通信、信号处理、雷达探测、医疗成像以及各种工业自动化应用中&#xff0c;模数转换器&#xff08;ADC&#xff09;和数模转换器&#xff08;DAC&#xff09;扮演着至关重要的角色。ADC负责将模拟信号精确且高效地转换为数字信号&#xff0c;以便于进行…

如何注释 PDF?注释PDF文件方法详情介绍

大多数使用 PDF 文档的用户都熟悉处理这种格式的文件时出现的困难。有些人仍然认为注释 PDF 的唯一方法是打印文档&#xff0c;使用笔或荧光笔然后扫描回来。 您可能需要向 PDF 添加注释、添加注释、覆盖一些文本或几何对象。经理、部门负责人在编辑公司内的合同、订单、发票或…

开源内容管理系统Wagtail本地安装运行并结合内网穿透实现公网访问

文章目录 前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个用Python编写的开源CMS&#xff0c;建立在Django Web框架上。Wagtail 是一个基于 Django 的开源内容管理系统&#xf…

uniapp自带的选择日期的使用

年月日的下拉框 直接看代码 <view class"uni-title uni-common-pl">日期选择器</view><view class"uni-list"><view class"uni-list-cell"><view class"uni-list-cell-left">当前选择</view>&…

基于 IDEA 进行 Maven 工程构建

一、构建概念和构建过程 项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程&#xff0c;在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。 项目构建是软件开发过程中至关重要的一部分&#xff0c;它能够大大提高软件开发效率&…