SpringBoot 实现登录功能

目录

  • 下发JWT 令牌
    • 依赖文件
    • 令牌生成
    • 令牌验证
  • 统一验证技术
    • 过滤器 Filter
      • 快速使用
      • 实现登录校验
    • 拦截器 Interceptor
      • 快速使用
      • 实现登录校验

下发JWT 令牌

全称: JSON Web Token

官网: https://jwt.io/

以JSON 的数据格式安全传输信息,利用 base64 进行编码。
在这里插入图片描述

组成:
第一部分:Header (头),记录 签名算法令牌类型
例如:{“alg”: “HS256”,“type”: “JWT”}

第二部分:Payload (有效载荷),携带自定义信息 ,一般为登录 账号 和 密码。

第三部分:Signature 防止 被篡改 将 header,payload,并加入指定密钥,通过指定签名算法计算而来。

依赖文件

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><!--  java 9 以上需要引入  --><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.1</version></dependency>

令牌生成

HashMap<String, Object> hashMap = new HashMap<>();hashMap.put("name", "lisi");hashMap.put("password", "1234");
String jwt = Jwts.builder()
/*sign 签名算法*/.signWith(SignatureAlgorithm.HS256, "ssstfthm")                   //sign  签名算法
/* 自定义内容 */ .setClaims(hashMap)                                              // 自定以内容
/*过期时间*/     .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))   .compact(); //生成令牌System.out.println(jwt);

令牌验证

Claims :可以像遍历一个 Map 一样遍历 Claims 对象中的所有声明。例如,可以使用 for (Map.Entry<String, Object> entry : claims.entrySet()) 来遍历所有声明,并访问它们的键和值。

String token = "eyJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQiLCJuYW1lIjoibGlzaSIsImV4cCI6MTczNTQ4NzczMH0.JnQhXvsx0ZOsrPrtrUmkZ-RLCaVgwP8dgrS6nArF-vQ";Claims claims = Jwts.parser().setSigningKey("ssstfthm") //设置签名.parseClaimsJws(token)     //令牌内容.getBody();     System.out.println(claims);

在这里插入图片描述

统一验证技术

过滤器 Filter

JavaWeb 三大组件之一 (Servlet , Filter ,Listener) 之一

一般完成 通用的操作,比如:登录校验,统一编码,敏感字符处理

快速使用

多个 过滤器 按类名排序
1.创建过滤器类
javax.servlet.Filter

@WebFilter(urlPatterns = "/*")    //配置拦截路径
public class FilterDemo implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("过滤器创建");Filter.super.init(filterConfig);}@Overridepublic void destroy() {System.out.println("过滤器销毁");Filter.super.destroy();}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("过滤器 拦截");//  放行操作filterChain.doFilter(servletRequest,servletResponse);}
}
  1. 在启动类中添加 @ServletComponentScan
org.springframework.boot.web.servlet.ServletComponentScan;

实现登录校验

在这里插入图片描述

@WebFilter(urlPatterns = "/*")
public class FilterDemo implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 1. 获取请求头HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;String url=request.getRequestURI();//2. 是登录请求直接放行if (url.contains("/login")) {filterChain.doFilter(servletRequest, servletResponse);System.out.println("登录操作合法");return;}//3. 获取请求头的令牌String jwt=request.getHeader("token");// 4.判断令牌是否存在,不存在返回错误if (!StringUtils.hasLength(jwt)) {//没有令牌 返回错误Result result=new Result(0,"NOT_LOGIN",null);//  手动转化  对象 --》json    阿里巴巴 fastjsonString notlogin= JSONObject.toJSONString(result);response.getWriter().write(notlogin);return;}//5.解析token,解析失败返回错误结果try {JwtUtils.parseJWT(jwt);} catch (Exception e) {Result result=new Result(0,"NOT_LOGIN",null);String notlogin= JSONObject.toJSONString(result);response.getWriter().write(notlogin);return;}//6. 放行filterChain.doFilter(servletRequest,servletResponse);}
}

拦截器 Interceptor

概念:是一种动态拦截方法调用的机制,类似于过滤器。Spring 框架中提供。

快速使用

1.定义拦截器,实现 HandlerInterfaceptor 接口

@Component   //交给IOC容器管理
public class LoginInterceptor implements HandlerInterceptor {@Override    //目标资源方法 运行前运行,   返回 true 放行     false,不放行public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return HandlerInterceptor.super.preHandle(request, response, handler);}@Override     // 运行后进行public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Override     // 最后运行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}
  1. 定义配置类

拦截路径:

拦截路径含义
/*一级路径
/**任意路径
/depts/*depts 下的一级路径
/depts/*depts 下的任意级路径

.excludePathPatterns(“/login”) 不需要拦截的资源

@Configuration    //配置类注解
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**");}
}

实现登录校验

public class LoginInterceptor implements HandlerInterceptor {@Override    //目标资源方法 运行前运行,   返回 true 放行     false,不放行public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token=request.getHeader("token");if (!StringUtils.hasLength(token)) {//没有令牌 返回错误Result result=new Result(0,"NOT_LOGIN",null);//  手动转化  对象 --》json   阿里巴巴 fastjsonString notlogin= JSONObject.toJSONString(result);response.getWriter().write(notlogin);return false;}try {JwtUtils.parseJWT(token);}catch (Exception e){String notlogin=JSONObject.toJSONString(new Result(0,"NOT_LOGIN",null));response.getWriter().write(notlogin);return false;}return true;}
}

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

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

相关文章

Disruptor 有哪些典型的使用场景?

大家好&#xff0c;我是君哥。 Disruptor 是一款高性能的内存有界队列&#xff0c;它通过内存预分配、无锁并发、解决伪共享问题、使用 RingBuffer 取代阻塞队列等措施来大幅提升队列性能。 但开发者们往往对它的使用场景不太了解&#xff0c;到底应该在哪些场景使用呢&#…

[MySQL报错]关于发生net start mysql 服务无法启动,服务没有报告任何错误的五种解决方案。

咋直接进入主题。 我遇到的问题是net start mysql 服务无法启动&#xff0c;服务没有报告任何错误 其问题出在哪里呢 一.ini文件配置问题 在于你没有给你下载好的mysql文件中配置.ini文件。 该如何配置呢。那就是先在文件夹中创建一个文本文件&#xff0c;把下面内容复制进去…

HTML5新特性|01 音频视频

音频 1、Audio (音频) HTML5提供了播放音频文件的标准 2、control(控制器) control 属性供添加播放、暂停和音量控件 3、标签: <audio> 定义声音 <source> 规定多媒体资源,可以是多个<!DOCTYPE html> <html lang"en"> <head><…

goView二开低代码平台1.0

官网文档地址&#xff1a;GoView 说明文档 | 低代码数据可视化开发平台 简介&#xff1a;GoView 是一个拖拽式低代码数据可视化开发平台&#xff0c;通过拖拽创建数据大屏&#xff0c;使用Vue3框架&#xff0c;Ts语言和NaiveUI组件库创建的开源项目。安装步骤和地址文档里都有…

2024年中国新能源汽车用车发展怎么样 PaperGPT(一)

概述 在国家政策的强力扶持下&#xff0c;2024年中国新能源汽车市场迎来了新的发展机遇。本文将基于《中国新能源汽车用车报告&#xff08;2024年&#xff09;》的数据&#xff0c;对新能源汽车的市场发展和用车趋势概述。 新能源汽车市场发展 政策推动&#xff1a;国家和地…

数据表中列的完整性约束概述

文章目录 一、完整性约束概述二、设置表字段的主键约束三、设置表字段的外键约束四、设置表字段的非空约束五、设置表字段唯一约束六、设置表字段值自动增加七、设置表字段的默认值八、调整列的完整性约束 一、完整性约束概述 完整性约束条件是对字段进行限制&#xff0c;要求…

Unity网络通信相关

Socket 通信一张图搞定 谁提供服务谁绑定端口&#xff0c;建立Listener,写Host

ChatGPT 与 AGI:人工智能的当下与未来走向全解析

在人工智能的浩瀚星空中&#xff0c;AGI&#xff08;通用人工智能&#xff09;无疑是那颗最为璀璨且备受瞩目的星辰。OpenAI 对 AGI 的定义为“在最具经济价值的任务中超越人类的高度自治系统”&#xff0c;并勾勒出其发展的五个阶段&#xff0c;当下我们大多处于以 ChatGPT 为…

七次课掌握 Photoshop

mediaTEA 的《七次课掌握 Photoshop》系列文章以循序渐进的教学方式&#xff0c;帮助学员在短时间内高效掌握 Photoshop 的核心功能。 从基础知识到高级技巧&#xff0c;课程涵盖图像编辑、选区与抠图、形状与文字、绘画与修饰、调整与混合、样式与滤镜&#xff0c;以及自动化与…

【Goland】怎么执行 go mod download

1、终端的执行 go mod tidy 2、终端执行不行的话&#xff0c;就可以通过右击go.mod文件来执行&#xff1b; 3、也可以按住Ctrl点击这个包安装&#xff1b;

玩转OCR | 腾讯云智能结构化OCR初次体验

目录 一、什么是OCR&#xff08;需要了解&#xff09; 二、产品概述与核心优势 产品概述 智能结构化能做什么 举例说明&#xff08;选看&#xff09; 1、物流单据识别 2、常见证件识别 3、票据单据识别 4、行业材料识别 三、产品特性 高精度 泛化性 易用性 四、…

基于BiLSTM和随机森林回归模型的序列数据预测

本文以新冠疫情相关数据集为案例,进行新冠数量预测。(源码请留言或评论) 首先介绍相关理论概念: 序列数据特点 序列数据是人工智能和机器学习领域的重要研究对象,在多个应用领域展现出独特的特征。这种数据类型的核心特点是 元素之间的顺序至关重要 ,反映了数据内在的时…

安装、快速入门

安装 sudo docker run \-e RABBITMQ_DEFAULT_USERroot \-e RABBITMQ_DEFAULT_PASS123456 \-v rabbitmq-plugins:/plugins \--name rabbitmq \--hostname rabbitmq \-p 15672:15672 \-p 5672:5672 \-d \rabbitmq 1、防火墙开放两个端口 2、RabbitMQ 安装 Web 插件&#xff1a; …

JVM学习:CMS和G1收集器浅析

总框架 一、Java自动内存管理基础 1、运行时数据区 运行时数据区可分为线程隔离和线程共享两个维度&#xff0c;垃圾回收主要是针对堆内存进行回收 &#xff08;1&#xff09;线程隔离 程序计数器 虚拟机多线程是通过线程轮流切换、分配处理器执行时间来实现的。为了线程切换…

用uniapp写一个播放视频首页页面代码

效果如下图所示 首页有导航栏&#xff0c;搜索框&#xff0c;和视频列表&#xff0c; 导航栏如下图 搜索框如下图 视频列表如下图 文件目录 视频首页页面代码如下 <template> <view class"video-home"> <!-- 搜索栏 --> <view class…

uniapp 判断多选、选中取消选中的逻辑处理

一、效果展示 二、代码 1.父组件: :id=“this.id” : 给子组件传递参数【id】 @callParentMethod=“takeIndexFun” :给子组件传递方法,这样可以在子组件直接调用父组件的方法 <view @click="$refs.member.open()"

影刀进阶指令 | Kimi (对标ChatGPT)

文章目录 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09;一. 需求二. 流程三. 实现3.1 流程概览3.2 流程步骤讲解1\. 确定问题2\. 填写问题并发送3\. 检测答案是否出完 四. 运维 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09; 简单讲讲RPA调用kimi实现…

【面试系列】深入浅出 Spring Boot

熟悉SpringBoot&#xff0c;对常用注解、自动装配原理、Jar启动流程、自定义Starter有一定的理解&#xff1b; 面试题 Spring Boot 的核心注解是哪个&#xff1f;它主要由哪几个注解组成的&#xff1f;Spring Boot的自动配置原理是什么&#xff1f;你如何理解 Spring Boot 配置…

MySQL root用户密码忘记怎么办(Reset root account password)

在使用MySQL数据库的的过程中&#xff0c;不可避免的会出现忘记密码的现象。普通用户的密码如果忘记&#xff0c;可以用更高权限的用户&#xff08;例如root&#xff09;进行重置。但是如果root用户的密码忘记了&#xff0c;由于root用户本身就是最高权限&#xff0c;那这个方法…

Java之内部类*

将一个类定义在另一个类或者一个方法的内部&#xff0c;前者称为内部类&#xff0c;后者称为外部类 实例内部类&#xff1a;实力内部类所处的位置与外部类成员位置相同&#xff0c;因此也受public private等访问限定符的约束静态内部类&#xff08;static&#xff09;匿名内部…