JavaWeb笔记整理10——JWT令牌、Filter、Interceptor

目录


1.简介

2.生成和校验 

3.登录-生成令牌

4.过滤器Filter

快速入门

Filter执行流程

Filter拦截路径

过滤器链

登录校验Filter

流程

代码

 5.拦截器Interceptor

快速入门 

Interceptor拦截路径

执行流程 

 代码


继笔记04-session cookie

1.简介

 

2.生成和校验 

 

    /** 测试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,"mikey")//设置签名算法.setClaims(claims)//自定义内容(载荷).setExpiration(new Date(System.currentTimeMillis()+3600*1000))//设置jwt令牌的有效期为1个小时.compact();//拿到字符串类型的返回值System.out.println(jwt);}/** 解析Jwt令牌* */@Testpublic void testParseJwt(){Claims claims = Jwts.parser().setSigningKey("mikey").parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTcyMzA0MjYxNH0.OXLa75G0jGPDwNz95sUurab16UWY-5ZEMjWbOncfqJM").getBody();System.out.println(claims);}

3.登录-生成令牌

工具类: 

package com.mikey.utils;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;public class JwtUtils {private static String signKey = "mikey";private static Long expire = 43200000L;/*** 生成JWT令牌* @param claims JWT第二部分负载 payload 中存储的内容* @return*/public static String generateJwt(Map<String, Object> claims){String jwt = Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256, signKey).setExpiration(new Date(System.currentTimeMillis() + expire)).compact();return jwt;}/*** 解析JWT令牌* @param jwt JWT令牌* @return JWT第二部分负载 payload 中存储的内容*/public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(jwt).getBody();return claims;}
}

Controller类:

package com.mikey.controller;import com.mikey.pojo.Emp;
import com.mikey.pojo.Result;
import com.mikey.service.EmpService;
import com.mikey.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@Slf4j
@RestController
public class LoginController {@Autowiredprivate EmpService empService;@PostMapping("/login")public Result login(@RequestBody Emp emp){log.info("员工登录:{}",emp);Emp e = empService.login(emp);//登陆成功 生成令牌并且下发令牌if(e!=null){Map<String, Object> claims = new HashMap<>();claims.put("id",e.getId());claims.put("name",e.getName());claims.put("username",e.getUsername());String jwt = JwtUtils.generateJwt(claims);//jwt包含了当前登录的员工信息return Result.success(jwt);}//登陆失败 返回错误信息return Result.error("用户名或密码错误");//return e!=null?Result.success():Result.error("用户名或密码错误");}
}

4.过滤器Filter

快速入门

Filter执行流程

 

Filter拦截路径

过滤器链

登录校验Filter

流程

代码
package com.mikey.filter;import com.alibaba.fastjson.JSONObject;
import com.mikey.pojo.Result;
import com.mikey.utils.JwtUtils;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;import java.io.IOException;@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) servletRequest;HttpServletResponse resp = (HttpServletResponse) servletResponse;//1.获取请求urlString url = req.getRequestURI().toString();log.info("请求的url:{}",url);//2.判断请求url中是否包含login,如果包含说明是登录操作,放行。if(url.contains("login")){log.info("登陆操作,放行");filterChain.doFilter(servletRequest,servletResponse);return;}//3.获取请求头中的令牌String jwt = req.getHeader("token");//4.判断令牌是否存在,如果不存在,则返回错误结果 未登录。if(!StringUtils.hasLength(jwt)){log.info("请求头taken为null,返回未登录的信息");Result error = Result.error("NOT_LOGIN");//手动转换 将对象转为json数据---》阿里巴巴fastJSON工具包 需要在pom文件中导入String notLoginn = JSONObject.toJSONString(error);resp.getWriter().write(notLoginn);return;}//5.若jwt令牌存在  解析token,如果解析失败 返回错误结果 未登录//快捷键alt crl ttry {JwtUtils.parseJWT(jwt);} catch (Exception e) {//jwt解析失败e.printStackTrace();log.info("解析令牌失败 返回未登陆的错误信息");Result error = Result.error("NOT_LOGIN");//手动转换 将对象转为json数据---》阿里巴巴fastJSON工具包String notLoginn = JSONObject.toJSONString(error);resp.getWriter().write(notLoginn);return;}//6.放行log.info("令牌合法 放行");filterChain.doFilter(servletRequest,servletResponse);}
}

 5.拦截器Interceptor

快速入门 

Interceptor拦截路径

执行流程 

 代码

package com.mikey.interceptor;import com.alibaba.fastjson.JSONObject;
import com.mikey.pojo.Result;
import com.mikey.utils.JwtUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {@Override//目标资源方法运行前运行,返回true:放行 返回false 不放行public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {//1.获取请求urlString url = req.getRequestURI().toString();log.info("请求的url:{}",url);//2.判断请求url中是否包含login,如果包含说明是登录操作,放行。if(url.contains("login")){log.info("登陆操作,放行");return true;//true代表放行 false代表不放行}//3.获取请求头中的令牌String jwt = req.getHeader("token");//4.判断令牌是否存在,如果不存在,则返回错误结果 未登录。if(!StringUtils.hasLength(jwt)){log.info("请求头taken为null,返回未登录的信息");Result error = Result.error("NOT_LOGIN");//手动转换 将对象转为json数据---》阿里巴巴fastJSON工具包String notLoginn = JSONObject.toJSONString(error);resp.getWriter().write(notLoginn);return false;}//5.若jwt令牌存在  解析token,如果解析失败 返回错误结果 未登录//快捷键alt crl ttry {JwtUtils.parseJWT(jwt);} catch (Exception e) {//jwt解析失败e.printStackTrace();log.info("解析令牌失败 返回未登陆的错误信息");Result error = Result.error("NOT_LOGIN");//手动转换 将对象转为json数据---》阿里巴巴fastJSON工具包String notLoginn = JSONObject.toJSONString(error);resp.getWriter().write(notLoginn);return false;}//6.放行log.info("令牌合法 放行");return true;}@Override//目标资源方法运行后运行public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle...");}@Override//试图渲染完毕后运行,最后运行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion...");}
}

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

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

相关文章

【秋招笔试】8.31京东秋招(研发岗)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

计算机毕业设计选题推荐-摇滚音乐鉴赏网站-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

滑动窗口系列(定长滑动窗口长度) 8/30

1.所有数对中 数位差之和() 题意&#xff1a; 给定一个nums数组&#xff0c;计算中所有整数数对中 数位差的个数之和&#xff1b; 数位差&#xff1a;某一位上的数字不一样就记作数位差。 eg:12 22; 十位上不一样&#xff0c;数位差为1 思路&#xff1a; 首先计算出一个数…

Linux信号处理机制基础

什么是信号 信号在最早的UNIX系统中即被引入&#xff0c;已有30多年的历史&#xff0c;但只有很小的变化。信号是提供异步事件处理机制的软件中断。进程之间可以相互发送信号&#xff0c;这使信号成为一种进程间通信(Inter-ProcessCommunication,lPC)的基本手段 信号的名称与…

splunk Enterprise 的HTTP收集器-windows

1.创建HTTP收集器 2.使用HTTP收集器 然后打开全局设置&#xff1a;把ssl给去掉&#xff0c;点保存&#xff08;保存之后&#xff0c;可以看到这些状态全部都是已启用了&#xff09;&#xff1a; 3.测试&#xff1a; curl --location --request POST http://192.168.11.131:808…

【自动驾驶】决策规划算法概述

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

卷积神经网络(CNN):算法、原理与应用

卷积神经网络&#xff08;Convolutional Neural Networks, CNN&#xff09;是深度学习领域中的重要算法之一&#xff0c;尤其在计算机视觉任务中表现出色。本文将从基础原理、核心组件、以及应用场景三个方面理解卷积神经网络的强大之处。 卷积神经网络的基本概念 卷积神经网…

u盘pe怎么安装系统_u盘pe安装系统详细步骤

u盘pe怎么安装系统&#xff1f;u盘pe安装系统需要准备一个u盘&#xff0c;然后将u盘制作成pe&#xff0c;进入pe后再安装系统&#xff0c;下面小编就教大家u盘pe安装系统详细步骤教程。 u盘pe启动盘是什么&#xff1f; u盘pe启动盘是一种可引导的USB存储设备&#xff0c;其中包…

10:Logic软件原理图中添加电源与GND

Logic软件原理图中添加电源与GND

Hive的存储格式

文章目录 Hive的存储格式1.存储格式简介2.行存储与列存储行式存储列式存储混合的 PAX 存储结构 TextFileSequenceFile Hive的存储格式 1.存储格式简介 Hive支持的存储数的格式主要有&#xff1a;TEXTFILE(默认格式) 、SEQUENCEFILE、RCFILE、ORCFILE、PARQUET。 textfile为默…

续:docker 仓库数据传输加密

上一个实验&#xff1a;非加密的形式在企业中是不被允许的。 示例&#xff1a;【为Registry 提供加密传输】 因为传输也是https&#xff0c;所以与ssh一样的加密。 ## 这种方式就不用写这个了。 [rootdocker ~]# cat /etc/docker/daemon.json #{ # "insecure-registrie…

7个流行的开源数据治理工具

数字化时代&#xff0c;数据是已经成为最宝贵的资产之一。数据支撑着我们的政府、企业以及各类组织的所有流程&#xff0c;并为决策以及智能化服务提供支撑。大数据有大用途&#xff0c;但是也可能隐藏着巨大的风险&#xff0c;特别是如果我们对数据的情况不是很了解的时候&…

计算机组成原理:实验四常规型微程序控制器组成实验

一、实验目的 1.掌握时序产生器的组成原理。 2.掌握微程序控制器的组成原理。 3.掌握微指令格式的化简和归并。 二、实验电路 1.时序发生器 TEC-4计算机组成原理实验系统的时序电路如图4.1所示。电路采用2片GAL22V10&#xff08;U6、U7&#xff09;&#xff0c;可产生两极…

钓鱼特辑(四)安全较量,摆脱“麻瓜”标签

时至今日&#xff0c;尽管员工们对网络安全有所了解&#xff0c;却往往因缺乏足够的安全意识而对攻防没有直观感知。在红队看来&#xff0c;普通员工可能犹如“麻瓜”&#xff0c;防御薄弱&#xff0c;易于突破。 现在红队以求职者或合作方等“人畜无害”的身份在日常沟通中发动…

Windows中pip换源

step1&#xff1a;检查是否安装 输入如下&#xff0c;出现版本号&#xff0c;就是安装好了 pip -V或pip --version pip3 -V pip3 --version step2&#xff1a;找到&#xff08;创建&#xff09;配置文件 对于 Windows 用户&#xff0c;配置文件在【%APPDATA%\pip\pip.ini】文…

AutoGen ConversableAgent 基类解析

目录 一、ConversableAgent 类 二、主要函数 1.1 __init__ 1.2 initiate_chat 本文主要对 AutoGen 代理的基类 ConversableAgent 进行介绍。 一、ConversableAgent 类 ConversableAgent 类是代理的基类&#xff0c;AssistantAgent 和 UserProxyAgent 是该类的子类&#x…

使用LinkedHashMap实现固定大小的LRU缓存

使用LinkedHashMap实现固定大小的LRU缓存 1. 什么是LRU&#xff1f; LRU是"Least Recently Used"的缩写&#xff0c;意为"最近最少使用"。LRU缓存是一种常用的缓存淘汰算法&#xff0c;它的核心思想是&#xff1a;当缓存满时&#xff0c;优先淘汰最近最少…

PTA L1-030 一帮一

L1-030 一帮一&#xff08;15分&#xff09; “一帮一学习小组”是中小学中常见的学习组织方式&#xff0c;老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作&#xff0c;即在得到全班学生的排名后&#xff0c;在当前尚…

Mac下的压缩包和Win看到的不一样怎么办 Mac压缩后Win电脑看文件名会乱码

在当今多平台的数字工作环境中&#xff0c;Mac和Windows用户常常需要交换文件&#xff0c;但有时候会遇到一些兼容性问题。特别是在处理压缩文件时&#xff0c;Mac用户创建的压缩包在Windows系统中打开时&#xff0c;常常会遇到文件名乱码的问题。本文将详细讨论“Mac下的压缩包…

C语言基础(二十八)

1、冒泡排序&#xff1a; #include "date.h" #include <stdio.h> #include <stdlib.h> #include <time.h> // 函数声明 void bubbleSort(int *arr, int n); int* createRandomArray(int n, int *size); int main() { int time getTi…