基于springboot的登录校验

server/2024/11/28 18:02:58/

🔥基于springboot的登录校验🔥

文章目录

  • 🔥基于springboot的登录校验🔥
    • 1. JWT令牌
    • 2. 过滤器Filter
    • 3. 拦截器Interceptor

🚀 开篇寄语:
还在为Spring Boot项目的登录校验而一筹莫展吗?本篇实战教程将是你破解这一难题的钥匙,从JWT令牌的生成与解析,到过滤器与拦截器的巧妙运用,我们将一步步揭开Spring Boot登录校验的神秘面纱,让你的项目安全性瞬间提升!

📖 精彩预告:

JWT令牌实战: 深入剖析JWT令牌的结构与原理,教你如何轻松生成与解析令牌,实现高效安全的登录认证。
过滤器Filter详解: 过滤器在Spring Boot中的强大作用,如何配置过滤器实现登录校验等特殊功能。
拦截器Interceptor应用: 拦截器的定义与配置,以及在登录校验中的实战应用,让你的项目更加灵活可控。

💡 为什么值得一读:

本篇教程不仅涵盖了Spring Boot登录校验的核心知识点,更通过实战案例让你深入理解每个细节。
无论你是初学者还是有一定经验的开发者,都能从中获得宝贵的经验与启示。通过本篇教程的学习,你将能够轻松应对Spring Boot项目中的登录校验问题,提升项目的安全性与可靠性。

1. JWT令牌

场景:登录认证

① 登录成功后,生成令牌

② 后续每个请求,都要携带JWT令牌,系统每次处理请求前,先进行令牌校验,通过后再处理请求

在这里插入图片描述

组成描述例子
Header(头)记录令牌类型、签名算法等{“alg”:“HS256”, “type”: “JWT”}
Payload(有效载荷)携带自定义信息{“id”:“1”, “username”: “tom”}
Signature(签名)防止token被串改由header+payload+密钥+签名算法

pom.xml依赖

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>

创建Jwt令牌

java">  public void creatJwt(){//定义map集合来封装自定义数据Map<String, Object> claims = new HashMap<>();claims.put("id", 1);claims.put("username", "tom");String jwt = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, "秘钥").setExpiration(new Date(System.currentTimeMillis() + 3600*1000))//设置JWT令牌有效期 -> 1h.compact();System.out.println(jwt);}

解析Jwt令牌

java">public void ParseJwt(){Claims claims = Jwts.parser().setSigningKey("秘钥").parseClaimsJws("Jwt令牌字符串")  //Jwt令牌字符串.getBody();  //拿到第二部分内容//输出解析的Jwt令牌内容System.out.println(claims);//{name=tom, id=1, exp=1732194534}
}

Jwt令牌工具类

java">import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;public class JwtUtil {private static String signKey = "itheima";private static Long expire = 43200000L;public static String creatJwt(Map<String, Object> claims) {claims.put("id", 1);claims.put("username", "tom");String jwt = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, signKey).setExpiration(new Date(System.currentTimeMillis() + expire))//设置JWT令牌有效期 -> 1h.compact();return jwt;}public static Claims ParseJwt(String jwt) {Claims claims = Jwts.parser().setSigningKey(signKey)  //给予前面自己生成JWT令牌所设置的签名秘钥才可以解析JWT令牌.parseClaimsJws(jwt)  //Jwt令牌字符串.getBody();  //拿到第二部分内容//输出解析的Jwt令牌内容return claims;}
}

2. 过滤器Filter

过滤器可以把请求拦截下来,实现一些特殊功能:登录校验,敏感字符处理等

在这里插入图片描述

  1. 定义Filter: 定义一个类,实现Filter接口
  2. 配置Filter: Filter类上加@WebFilter注解,配置拦截资源的路径,引导类上加@ServeletComponentScan开启对Servlet组件支持。
java">@WebFilter(urlPatterns = "/*")
public class TestFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("拦截到了请求:放行前的逻辑");//放行chain.doFilter(request, response);System.out.println("拦截到了请求:放行后的逻辑");}
}
java">@ServletComponentScan
@SpringBootApplication
public class SpringbootWebMyprojectApplication {public static void main(String[] args) {SpringApplication.run(SpringbootWebMyprojectApplication.class, args);}
}

Filter的应用:
在这里插入图片描述

代码:

java">@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 1.获取请求urlHttpServletRequest req = (HttpServletRequest) request;HttpServletResponse resp = (HttpServletResponse) response;String url = req.getRequestURL().toString();log.info("请求的url:{}", url);// 2.判断url是否包含login,如果包含为登录操作,放行if(url.contains("login")){log.info("登录操作,放行...");chain.doFilter(request,response);return;}// 3.获取请求头的JWT令牌String jwt = req.getHeader("token");// 4.判断令牌是否存在,不存在返回错误if(!StringUtils.hasLength(jwt)){log.info("请求头token为空,返回未登录");Result error = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return;}// 5.解析JWT,解析失败返回错误try {JwtUtil.parseJwt(jwt);} catch (Exception e) {e.printStackTrace();log.info("解析令牌失败,返回错误信息");Result error = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return;}// 6.放行log.info("令牌合法");chain.doFilter(request,response);}
}

3. 拦截器Interceptor

在这里插入图片描述

  1. 定义拦截器: 实现HandlerInterceptor接口
java">@Component
public class LoginCheckInterceptor implements HandlerInterceptor {@Override//目标资源方法执行前运行  // 目标资源方法执行前运行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. **配置拦截器:**定义配置类,实现WebMvcConfigurer接口
java">@Configuration //配置类
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");}
}
  1. 拦截器-拦截路径:

在这里插入图片描述

  1. 拦截器-执行流程

在这里插入图片描述

  1. 登录校验

在这里插入图片描述

java">@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {@Override//目标资源方法执行前运行  // 目标资源方法执行前运行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.获取请求头的JWT令牌String jwt = req.getHeader("token");// 4.判断令牌是否存在,不存在返回错误if(!StringUtils.hasLength(jwt)){log.info("请求头token为空,返回未登录");Result error = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(error);resp.getWriter().write(notLogin);return false;}// 5.解析JWT,解析失败返回错误try {JwtUtil.parseJwt(jwt);} catch (Exception e) {e.printStackTrace();log.info("解析令牌失败,返回错误信息");Result error = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(error);resp.getWriter().write(notLogin);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");}
}
java">@Configuration //配置类
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");}
}
java">@Configuration //配置类
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");}
}

🔥 结语:

通过本篇教程的学习,相信你已经对Spring Boot的登录校验有了深入的理解与掌握。
无论是JWT令牌的使用,还是过滤器与拦截器的配置,都将成为你项目中不可或缺的安全利器。
希望本篇教程能够对你的学习与工作有所帮助,让你的SpringBoot项目更加安全、高效!


http://www.ppmy.cn/server/145685.html

相关文章

《Opencv》基础操作<1>

目录 一、Opencv简介 主要特点&#xff1a; 应用领域&#xff1a; 二、基础操作 1、模块导入 2、图片的读取和显示 &#xff08;1&#xff09;、读取 &#xff08;2&#xff09;、显示 3、 图片的保存 4、获取图像的基本属性 5、图像转灰度图 6、图像的截取 7、图…

第12章 手写Spring MVC

第十二章 手写Spring MVC 12.1 基本结构搭建 12.1.1 创建Maven模块 12.1.2 引入Servlet依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XM…

iframe温习+应用

文章目录 iframe 一、iframe的优缺点&#xff08;一&#xff09;优点&#xff08;二&#xff09;缺点 二、iframe基础应用&#xff08;一&#xff09;基本语法&#xff08;二&#xff09;在实际场景中的应用 三、iframe在无界微前端中的应用解析&#xff08;一&#xff09;沙箱…

QT QVerticalSpacer控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…

ElasticSearch通过es-head插件安装可视化及相关问题

1.es-head下载地址 GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster 2.启动 建议使用vscode启动&#xff0c;并安装好node.js环境 npm installnpm run start 通过http://localhost:9100就可以看到本地添加的es库 3.相关问题 3.1跨域问…

Python从0到100(七十三):Python OpenCV-OpenCV实现手势虚拟拖拽

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

uniapp中的事件:v-on

uni中的事件 1.v-on事件绑定 v-on 指令&#xff0c;它用于监听 DOM 事件。v-on缩写为‘ ’&#xff0c;下文简称为 事件 <!-- 完整语法 --><view v-on:click"doSomething">点击</view><!-- 缩写 --><view click"doSomething"…

Vue + Vite + Element Plus 与 Django 进行前后端对接

在现代 Web 开发中,前后端分离架构越来越受欢迎。这种架构允许前端和后端独立开发和部署,提高了开发效率和灵活性。在本文中,我们将介绍如何使用流行的 JavaScript 框架 Vue 和 UI 库 Element Plus 构建前端应用程序,并与 Python Web 框架 Django 进行对接。 © ivwdcwso (…