当前位置: 首页 > news >正文

登录校验及全局异常处理器

登录校验

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

JWT令牌(JSON Web Token)
1. 组成
  • 第一部分:Heade(头),记录令牌类型,算法签名等。例如:{"alg":"HS256","type":"JWT"}
  • 第二部分:Payload(有效载荷),携带一些自定义信息,默认信息等等。例如:{"id":"1","name":"Tom"}
  • 第三部分:Signature(签名),防止Token被篡改,确保安全性。将Header , payload , 并加入指定秘钥 , 通过指定签名算法计算而来

2. 生成/解析
 @Testpublic void testGenJWT(){HashMap<String, Object> claims = new HashMap<>();claims.put("id",1);claims.put("name","Tom");String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, "comcrn")//签名算法.setClaims(claims)//自定义内容,载荷.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置有效期是一个小时.compact();System.out.println(jwt);}@Test//解析public void testParseJwt(){Claims claims= Jwts.parser().setSigningKey("comcrn").parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiVG9tIiwiaWQiOjEsImV4cCI6MTcxNjk5NTA1Nn0.ArBnzJo8SWv1YbJIddsiH8_ZgAX_IapDf0vENI43tfo").getBody();System.out.println(claims);}
过滤器Filter
  • 一般完成一些通用的操作 , 比如 : 登录校验 , 统一编码处理 , 敏感字符处理等 .
1. 快速入门
1.1. 定义Filter:定义一个类,实现Filter接口,并重写其所有方法
package com.crn.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {@Override //初始化方法,只调用一次public void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Override //拦截到请求之后调用,调用多次public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//放行filterChain.doFilter(servletRequest,servletResponse);}@Override//销毁方法,只调用一次public void destroy() {Filter.super.destroy();}
}
1.2. 配置Filter:Filter配置类上加@WebFilter注解,配置资源拦截的路劲.引导类加上@ServletComponentScan开启支持Servlet组件
package com.crn;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@ServletComponentScan
@SpringBootApplication
public class SpringbootTliasYbApplication {public static void main(String[] args) {SpringApplication.run(SpringbootTliasYbApplication.class, args);}}
 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>
2. 过滤器链
  • 注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序
3. 登录校验流程
package com.crn.filter;import com.alibaba.fastjson.JSONObject;
import com.crn.pojo.Result;
import com.crn.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;@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.getRequestURL().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("令牌不存在,请先登录");Result error = Result.error("NOT_LOGIN");//手动转换  对象-->json  ---->阿里巴巴fastJSONString jsonString = JSONObject.toJSONString(error);resp.getWriter().write(jsonString);return ;}//5.解析token,如果解析失败,返回错误结果try {JwtUtils.parseJWT(jwt);} catch (Exception e) { //解析失败e.printStackTrace();log.info("令牌解析失败");Result error = Result.error("NOT_LOGIN");//手动转换  对象-->json  ---->阿里巴巴fastJSONString jsonString = JSONObject.toJSONString(error);resp.getWriter().write(jsonString);return ;}//6.放行log.info("令牌合法,放行");filterChain.doFilter(servletRequest, servletResponse);}
}
拦截器Interceptor
  • spring框架提供的,用来动态拦截控制器方法的执行
1. 快速入门
1.1. 定义拦截器,实现HandlerInterceptor接口,并从写其方法
package com.crn.interceptor;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class LoginCheckInterceptor implements HandlerInterceptor {@Override //目标资源方法运行前运行,返回为true,代表放行;返回值为false,代表拦截public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle运行了...");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运行了...");}
}
1.2. 定义拦截器
package com.crn.config;import com.crn.interceptor.LoginCheckInterceptor;
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 LoginCheckInterceptor loginCheckInterceptor;@Override //注册拦截器public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");}
}
2. 详解

3. 登录校验流程
package com.crn.interceptor;import com.alibaba.fastjson.JSONObject;
import com.crn.pojo.Result;
import com.crn.utils.JwtUtils;
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;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@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.getRequestURL().toString();log.info("url:{}", url);//2.判断URL中是否包含login,如果包含,说明是登录操作,放行if(url.contains("login")){log.info("登录操作,放行");return true;}//3.获取请求头中的令牌String jwt = req.getHeader("token");//4.判断令牌是否存在if(!StringUtils.hasLength(jwt)){//令牌不存在,说明用户没有登录,返回错误信息log.info("令牌不存在,请先登录");Result error = Result.error("NOT_LOGIN");//手动转换  对象-->json  ---->阿里巴巴fastJSONString jsonString = JSONObject.toJSONString(error);resp.getWriter().write(jsonString);return false;}//5.解析token,如果解析失败,返回错误结果try {JwtUtils.parseJWT(jwt);} catch (Exception e) { //解析失败e.printStackTrace();log.info("令牌解析失败");Result error = Result.error("NOT_LOGIN");//手动转换  对象-->json  ---->阿里巴巴fastJSONString jsonString = JSONObject.toJSONString(error);resp.getWriter().write(jsonString);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运行了...");}
}
过滤器与拦截器的区别

  • 接口规范不同:过滤器需要实现Filter接口,二拦截器需要实现HandleInterceptor接口
  • 拦截范围不同:过滤器Filer会拦截所有资源,而Interceptor只会拦截进入Spring环境中的资源

异常处理器

package com.crn.exception;import com.crn.pojo.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;/*** 全局异常处理器*/
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class) //捕获所有异常public Result ex(Exception e){e.printStackTrace();return Result.error("对不起,操作失败,请联系管理员");}
}

相关文章:

登录校验及全局异常处理器

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

计算机视觉与模式识别实验1-2 图像的形态学操作

文章目录 &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1;1.图像膨胀2.图像腐蚀3.膨胀与腐蚀的综合使用4.对下面二值图像的目标提取骨架&#xff0c;并分析骨架结构。 &#x1f9e1;&#x1f9e1;全部代码&#x1f9e1;&#x1f9e1; &#x1f9e1;&#x1f9e1…...

【前端每日基础】day31——uni-app

uni-app 开发详细介绍 基本概念 uni-app&#xff1a;uni-app 是一个使用 Vue.js 开发多端应用的框架&#xff0c;可以编译到微信小程序、支付宝小程序、百度小程序、字节跳动小程序、H5、App等多个平台。 跨平台&#xff1a;一次开发&#xff0c;多端部署。通过条件编译实现多…...

云动态摘要 2024-05-31

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [1.5折起]年中盛惠--AI分会场 腾讯云 2024-05-30 人脸核身、语音识别、文字识别、数智人、腾讯混元等热门AI产品特惠&#xff0c;1.5折起 云服务器ECS试用产品续用 阿里云 2024-04-14 云…...

Oracle数据块如何存储真实数据

上周休假了几天,颓废了,没有输出。今天写一点内容。 先抛出一个问题。表中的数据在Oracle数据块中是如何存储的呢?今天简单说一下这个问题。通常数据库中的表会存储字符,数字,日期 这3种常见的数据类型。下面的例子就用这3种数据类型作说明 首先,Oracle数据块底层存储这…...

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第30课-门的移动动画

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第30课-门的移动动画 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…...

智能化改造给企业带来的实际效果

1. 提高生产效率&#xff1a;通过自动化和智能化的生产线&#xff0c;减少人工操作&#xff0c;显著提升单位时间内的生产量。 2. 提升产品质量&#xff1a;智能化改造通过精确控制生产过程&#xff0c;减少人为错误&#xff0c;提高产品的一致性和可靠性。 3. 降低生产成本&am…...

深度学习-语言模型

深度学习-语言模型 统计语言模型神经网络语言模型语言模型的应用序列模型&#xff08;Sequence Model&#xff09;语言模型&#xff08;Language Model&#xff09;序列模型和语言模型的区别 语言模型&#xff08;Language Model&#xff09;是自然语言处理&#xff08;NLP&…...

微型导轨在自动化制造中有哪些优势?

微型导轨在自动化制造中发挥重要作用&#xff0c;能够满足自动化设备制造中对精度要求较高的工艺环节。适用于自动装配线、自动检测设备和机器人操作等环节&#xff0c;推动了行业的进步与发展。那么&#xff0c;微型导轨在使用中有哪些优势呢&#xff1f; 1、精度高和稳定性强…...

探索气象数据的多维度三维可视化:PM2.5、风速与高度分析

探索气象数据的多维度可视化&#xff1a;PM2.5、风速与高度分析 摘要 在现代气象学中&#xff0c;数据可视化是理解复杂气象模式和趋势的关键工具。本文将介绍一种先进的数据可视化技术&#xff0c;它能够将PM2.5浓度、风速和高度等多维度数据以直观和动态的方式展现出来。 …...

【传知代码】双深度学习模型实现结直肠癌检测(论文复现)

前言&#xff1a;在医学领域&#xff0c;科技的进步一直是改变人类生活的关键驱动力之一。随着深度学习技术的不断发展&#xff0c;其在医学影像诊断领域的应用正日益受到关注。结直肠癌是一种常见但危害极大的恶性肿瘤&#xff0c;在早期发现和及时治疗方面具有重要意义。然而…...

平衡二叉树的应用举例

AVL 是一种自平衡二叉搜索树&#xff0c;其中任何节点的左右子树的高度之差不能超过 1。 AVL树的特点&#xff1a; 1、它遵循二叉搜索树的一般属性。 2、树的每个子树都是平衡的&#xff0c;即左右子树的高度之差最多为1。 3、当插入新节点时&#xff0c;树会自我平衡。因此…...

一键安装 HaloDB 之 Ansible for Halo

↑ 关注“少安事务所”公众号&#xff0c;欢迎⭐收藏&#xff0c;不错过精彩内容~ 前倾回顾 前面介绍了“光环”数据库的基本情况和安装办法。 哈喽&#xff0c;国产数据库&#xff01;Halo DB! 三步走&#xff0c;Halo DB 安装指引 以及 HaloDB 的 Oracle 和 MySQL 兼容模式: …...

el-table的上下筛选功能

el-table的sort-change事件可以监听到筛选的事件&#xff1b; 会返回prop属性和order排序的顺序&#xff1b; html&#xff1a; <el-table :data"tableData" border style"width: 100%" :cell-style"{ textAlign: center }"header-cell-c…...

【手撕面试题】Vue(高频知识点一)

每天10道题&#xff0c;100天后&#xff0c;搞定所有前端面试的高频知识点&#xff0c;加油&#xff01;&#xff01;&#xff01;&#xff0c;在看文章的同时&#xff0c;希望不要直接看答案&#xff0c;先思考一下自己会不会&#xff0c;如果会&#xff0c;自己的答案是什么&…...

LabVIEW车轮动平衡检测系统

LabVIEW车轮动平衡检测系统 随着汽车行业的快速发展&#xff0c;车轮动平衡问题对乘坐舒适性、操控稳定性及安全性的影响日益凸显&#xff0c;成为了提高汽车性能的一个关键环节。传统的检测系统因精度低、成本高、操作复杂等问题&#xff0c;难以满足现代汽车行业的需求。开发…...

【Python爬虫--scrapy+selenium框架】超详细的Python爬虫scrapy+selenium框架学习笔记(保姆级别的,非常详细)

六&#xff0c;selenium 想要下载PDF或者md格式的笔记请点击以下链接获取 python爬虫学习笔记点击我获取 Scrapyselenium详细学习笔记点我获取 Python超详细的学习笔记共21万字点我获取 1&#xff0c;下载配置 ## 安装&#xff1a; pip install selenium## 它与其他库不同…...

【Linux】Linux环境基础开发工具_3

文章目录 四、Linux环境基础开发工具2. vim3. gcc和g动静态库的理解 未完待续 四、Linux环境基础开发工具 2. vim vim 怎么批量化注释呢&#xff1f;最简单的方法就是在注释开头和结尾输入 /* 或 */ 。当然也可以使用快捷键&#xff1a; Ctrl v 按 hjkl 光标移动进行区域选择…...

数字水印 | 图像噪声攻击(高斯/椒盐/泊松/斑点)

目录 Noise Attack1 高斯噪声&#xff08;Gaussian Noise&#xff09;2 椒盐噪声&#xff08;Salt and Pepper Noise&#xff09;3 泊松噪声&#xff08;Poisson Noise&#xff09;4 斑点噪声&#xff08;Speckle Noise&#xff09;5 完整代码 参考博客&#xff1a;Python…...

LeetCode-47 全排列Ⅱ

LeetCode-47 全排列Ⅱ 题目描述解题思路代码说明 题目描述 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 &#xff1a; 输入&#xff1a;nums [1,1,2]输出&#xff1a; [[1,1,2], [1,2,1], [2,1,1]] b站题目解读讲的不好&…...

如何加入GEO从入门到精通知识星球?

很多人学了GEO理论&#xff0c;却不知道怎么落地——因为GEO不是靠手动摸索能高效完成的&#xff0c;它需要工具支撑每一个环节。GEO优化分三个核心环节&#xff0c;每个环节都有对应的工具。第一环节&#xff1a;问题挖掘用什么工具&#xff1a;GEO之家问题大师传统SEO靠关键词…...

ASPICE汽车软件开发标准:V模型、能力等级与核心过程实战解析

1. 项目概述&#xff1a;为什么我们需要ASPICE这张“汽车软件地图”如果你在汽车行业&#xff0c;尤其是涉及软件、电子电气或系统开发的岗位待过一阵子&#xff0c;大概率会频繁听到一个词&#xff1a;ASPICE。它可能出现在项目启动会上&#xff0c;出现在供应商审核清单里&am…...

Java——定时任务

定时任务1、Timer和TimerTask1.1、基本用法1.2、基本示例1.3、基本原理1.4、死循环1.5、异常任务1.6、总结2、ScheduledExecutorService2.1、基本用法2.2、基本示例2.3、基本原理在Java中&#xff0c;主要有两种方式实现定时任务&#xff1a; 使用java.util包中的Timer和Timer…...

【197期】视频一键转图文笔记

这期分享一个自己一直在用的视频转图文笔记工具&#xff0c;把视频文件和对应的字幕文件拖进去&#xff0c;一键就能生成详细的图文笔记。目前自媒体平台上的文章基本都靠这个流程来出&#xff0c;不用另外再写一遍&#xff0c;效率高了很多。使用方式很简单&#xff0c;把视频…...

彻底解决GeoServer跨域:手把手教你配置web.xml与添加Jetty依赖包

彻底解决GeoServer跨域问题&#xff1a;原理剖析与实战配置指南 当你在OpenLayers或Cesium中调用GeoServer的WMS/WFS服务时&#xff0c;是否遇到过令人头疼的跨域错误&#xff1f;这个问题看似简单&#xff0c;却隐藏着Web安全策略与地理信息服务集成的深层逻辑。本文将带你从H…...

基于Docker与MCP协议构建AI智能体安全扩展工具箱

1. 项目概述&#xff1a;一个为AI应用量身打造的“服务管家”最近在折腾AI应用开发&#xff0c;特别是那些基于大语言模型&#xff08;LLM&#xff09;的智能体&#xff08;Agent&#xff09;时&#xff0c;我遇到了一个挺普遍但很棘手的问题&#xff1a;我的AI助手能力很强&am…...

深度测评2026广州个体户核定流程精选榜单,革新个体工商户税务办理新变革

在数字经济浪潮席卷之下&#xff0c;个体工商户税务办理正面临前所未有的变革压力与机遇窗口。2026年的广州&#xff0c;作为电商与直播产业的高地&#xff0c;其个体户核定流程的效率与合规性&#xff0c;已成为衡量区域营商环境的试金石。然而&#xff0c;一个深层的价值悖论…...

破解软件安全计划人才困局:从安全左移到DevSecOps实践

1. 软件安全计划&#xff08;SSI&#xff09;的困境与破局&#xff1a;从一份调查报告说起 最近&#xff0c;一份由新思科技&#xff08;Synopsys&#xff09;在中国市场发起的调查报告&#xff0c;在不少技术管理者的圈子里引发了讨论。报告里一个刺眼的数字是&#xff1a; 6…...

ElevenLabs奥里亚文语音SDK集成终极 checklist:从Unicode 13.0字符兼容性到Odia Conjunct Glyph渲染异常修复

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs奥里亚文语音SDK集成终极 checklist&#xff1a;从Unicode 13.0字符兼容性到Odia Conjunct Glyph渲染异常修复 Unicode 13.0 兼容性验证 ElevenLabs v4.2.1 SDK 默认支持 Unicode 13.0&…...

taotoken token plan套餐为长期项目带来的成本控制优势

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken Token Plan套餐为长期项目带来的成本控制优势 在持续进行AI功能开发的软件项目中&#xff0c;模型API的调用成本是研发预…...