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

【学习总结|DAY032】后端Web实战:登录认证

在 Web 后端开发中,登录认证是保障系统安全和用户数据隐私的关键环节。本文将结合实际开发案例,深入探讨登录功能与登录校验的实现思路和技术细节,希望能帮助读者更好地掌握这一重要知识点。

一、登录功能实现

1.1 思路分析

登录功能的核心在于验证用户输入的用户名和密码是否正确。当用户名和密码都匹配时,判定登录成功;反之则登录失败。从技术角度看,登录功能本质上是依据用户名和密码查询员工信息。例如,在 Tlias 智能学习辅助系统中,用户输入用户名和密码,系统在数据库中查找对应员工记录,以此确定登录结果。

1.2 接口设计

  • 请求路径/login
  • 请求方式POST
  • 请求参数:以application/json格式传递,包含必填的username(用户名,字符串类型)和password(密码,字符串类型)。请求数据样例:
{"username": "jinyong","password":"123456"
}
  • 响应数据:同样采用application/json格式,包含必须的code(响应码,1 表示成功,0 表示失败)、非必须的msg(提示信息,字符串类型)以及必须的data(返回数据对象)。data对象包含员工 ID(id,数字类型)、用户名(username,字符串类型)、姓名(name,字符串类型)和令牌(token,字符串类型)。响应数据样例:
{"code":1,"msg":"success","data":{"id":2,"username": "songjiang","name":"宋江","token": "eyJhbGci0iJIUzI1NiJ9.eyJpZCI65hbWUi0iJzb2CJJeHAi0jE20Tg3MDE3NjJ9..."}
}

1.3 代码实现

在 Java 开发中,以 Spring Boot 和 MyBatis 框架为例,在业务逻辑层实现登录功能:

@Service
public class EmpService {@Autowiredprivate EmpMapper empMapper;public LoginInfo login(Emp emp) {// 调用mapper,根据用户名密码查询员工信息Emp e = empMapper.login(emp.getUsername(), emp.getPassword());// 如果员工存在,组装登录成功信息if (e != null){Map<String, Object> claims = new HashMap<>();claims.put("id", e.getId());claims.put("username", e.getUsername());return new LoginInfo(e.getId(), e.getUsername(), e.getName(), JwtUtils.generateJwt(claims));}return null;}
}

上述代码中,EmpMapper负责数据库查询操作,JwtUtils.generateJwt(claims)用于生成 JWT 令牌。

二、登录校验技术

在测试登录功能时,常出现未登录也能访问服务端功能接口的问题。为解决该问题,需引入登录校验机制,确保只有登录成功的用户才能访问后台系统数据。实现登录校验主要涉及会话技术、JWT 令牌、过滤器(Filter)和拦截器(Interceptor)。

2.1 会话技术

会话指用户从打开浏览器访问 Web 服务器资源到断开连接的过程,期间包含多次请求和响应。会话跟踪用于识别多次请求是否来自同一浏览器,以实现同一会话内多次请求间的数据共享。常见的会话跟踪方案有:

  • Cookie(客户端会话跟踪技术):利用 HTTP 协议中的Set-Cookie响应头和Cookie请求头传递数据。优点是 HTTP 协议原生支持;缺点是移动端 APP 无法使用,安全性低(用户可禁用)且不能跨域。
  • Session(服务端会话跟踪技术):底层基于 Cookie,通过JSESSIONID标识会话。优点是数据存储在服务端,相对安全;缺点是服务器集群环境下无法直接使用,且存在 Cookie 的固有缺点。
  • 令牌技术:支持 PC 端和移动端,能解决集群环境下的认证问题,减轻服务器存储压力,但需要自行实现。

2.2 JWT 令牌

  • 介绍:JSON Web Token(JWT)是一种简洁、自包含的格式,用于在通信双方以 JSON 数据格式安全传输信息。它由三部分组成:
    • Header(头):记录令牌类型、签名算法等,如{"alg":"HS256","type":"JWT"}
    • Payload (有效载荷):携带自定义信息和默认信息,如{"id":"1","username":"Tom"}
    • Signature (签名):通过将headerpayload和指定秘钥,利用指定签名算法计算生成,用于防止 Token 被篡改,确保安全性。
  • 生成 / 解析:在 Java 项目中,引入jjwt依赖后,可借助官方工具类Jwts生成和解析 JWT 令牌。
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>

生成令牌示例:

@Test
public void testGenJwt() {Map<String, Object> claims = new HashMap<>();claims.put("id", 10);claims.put("username", "itheima");String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, "SVRIRUlNQQ==").addClaims(claims).setExpiration(new Date(System.currentTimeMillis() + 12*3600*1000)).compact();System.out.println(jwt);
}

解析令牌示例:

@Test
public void testParseJwt() throws Exception {String jwtToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...";Claims claims = Jwts.parser().setSigningKey("SVRIRUlNQQ==").parseClaimsJws(jwtToken).getBody();System.out.println(claims);
}

2.3 过滤器(Filter)

  • 概念:Filter 是 JavaWeb 三大组件之一,能拦截对资源的请求,实现通用操作,如登录校验、统一编码处理等。
  • 快速入门
    • 定义 Filter:创建类实现Filter接口,并重写其initdoFilterdestroy方法。
@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {// 初始化方法,服务器启动时调用一次public void init(FilterConfig filterConfig) throws ServletException {System.out.println("init ...");}// 拦截到请求时调用,可多次调用public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws Exception{System.out.println("拦截到了请求...");chain.doFilter(servletRequest, servletResponse);}// 销毁方法,服务器关闭时调用一次public void destroy() {System.out.println("destroy ... ");}
}

  • 配置 Filter:在 Filter 类上使用@WebFilter注解配置拦截路径,在引导类上加@ServletComponentScan开启 Servlet 组件支持。
@ServletComponentScan
@SpringBootApplication
public class TliasManagementApplication {
}

  • 令牌校验 Filter
    • 流程:获取请求 URL,判断是否为登录请求(包含login),若是则放行;否则获取请求头中的令牌,判断令牌是否存在,若不存在或解析失败则响应 401,解析成功则放行。
@WebFilter(urlPatterns = "/*")
public class JwtFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;String requestURI = httpRequest.getRequestURI();if (requestURI.contains("login")) {chain.doFilter(request, response);return;}String token = httpRequest.getHeader("token");if (token == null) {HttpServletResponse httpResponse = (HttpServletResponse) response;httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return;}try {Claims claims = Jwts.parser().setSigningKey("SVRIRUlNQQ==").parseClaimsJws(token).getBody();chain.doFilter(request, response);} catch (Exception e) {HttpServletResponse httpResponse = (HttpServletResponse) response;httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);}}// init和destroy方法省略
}

  • 执行流程:放行前逻辑 -> 放行 -> 访问资源 -> 放行后逻辑。
  • 拦截路径/*表示拦截所有资源;/emps/*表示拦截/emps目录下的所有资源。
  • 过滤器链:一个 Web 应用中可配置多个过滤器形成过滤器链,注解配置的 Filter 优先级按类名字符串自然排序。

2.4 拦截器(Interceptor)

  • 概念:拦截器是 Spring 框架提供的动态拦截控制器方法执行的机制,可在方法调用前后执行预设代码。
  • 快速入门
    • 定义拦截器:实现HandlerInterceptor接口,重写preHandle(目标资源方法执行前执行,返回true放行,false不放行)、postHandle(目标资源方法执行后执行)和afterCompletion(视图渲染完毕后执行)方法。
@Component
public class DemoInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {return true;}@Overridepublic void postHandle(HttpServletRequest req, HttpServletResponse resp, Object handler, ModelAndView mv) throws Exception {System.out.println("preHandle...");}@Overridepublic void afterCompletion(HttpServletRequest req, HttpServletResponse resp, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion...");}
}

  • 注册拦截器:定义配置类实现WebMvcConfigurer接口,注册拦截器。
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate DemoInterceptor demoInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(demoInterceptor).addPathPatterns("/**");}
}

  • 令牌校验拦截器:与令牌校验 Filter 流程类似,获取请求 URL 判断是否为登录请求,获取并校验令牌。
@Component
public class JwtInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String requestURI = request.getRequestURI();if (requestURI.contains("login")) {return true;}String token = request.getHeader("token");if (token == null) {response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}try {Claims claims = Jwts.parser().setSigningKey("SVRIRUlNQQ==").parseClaimsJws(token).getBody();return true;} catch (Exception e) {response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}}// postHandle和afterCompletion方法省略
}

  • 拦截路径/*只能拦截一级路径;/**能拦截任意级路径。
  • 执行流程:与过滤器不同,拦截器只拦截 Spring 环境中的资源,且在控制器方法前后执行不同逻辑。

通过上述登录功能和登录校验技术的详细介绍,希望读者对 Web 后端开发中的登录认证机制有更深入的理解和掌握,在实际项目中能够灵活运用这些技术,构建安全可靠的 Web 应用。

相关文章:

【学习总结|DAY032】后端Web实战:登录认证

在 Web 后端开发中&#xff0c;登录认证是保障系统安全和用户数据隐私的关键环节。本文将结合实际开发案例&#xff0c;深入探讨登录功能与登录校验的实现思路和技术细节&#xff0c;希望能帮助读者更好地掌握这一重要知识点。 一、登录功能实现 1.1 思路分析 登录功能的核心…...

leetcode 123. 买卖股票的最佳时机 III

题目&#xff1a;123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09; O(N)的算法&#xff1a; f[i] max(max(0, prices[i] - min(prices[0], prices[1], ... , prices[i - 1)), f[i - 1]); g[i] max(max(0, max(prices[i 1], prices[i 2], ... , pric…...

Apache Tika 详解

Apache Tika是一个开源的、跨平台的库&#xff0c;专门用于检测、提取和解析多种文件格式的元数据。以下是对Apache Tika的详细解析&#xff1a; 一、概述 Apache Tika旨在为各种类型的数据提取提供一个单一的API&#xff0c;它支持多种文件格式&#xff0c;包括文档、图片、…...

ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认

OpenAI的ChatGPT爬虫似乎能够对任意网站发起分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;而OpenAI尚未承认这一漏洞。 本月&#xff0c;德国安全研究员Benjamin Flesch通过微软的GitHub分享了一篇文章&#xff0c;解释了如何通过向ChatGPT API发送单个HTTP请求…...

Qt——界面优化

在Qt中进行界面优化&#xff0c;可以从以下几个方面入手: 1.使用QWidget:setVisible来控制Widget的 显示和隐藏&#xff0c;而不是删除和重建。 2.使用QPainter直 接绘制组件&#xff0c;避免使用复杂的布局。 3.使用QSS进行样式设置&#xff0c; 减少图片资源的使用。 4.使…...

python学opencv|读取图像(四十一 )使用cv2.add()函数实现各个像素点BGR叠加

【1】引言 前序已经学习了直接在画布上使用掩模&#xff0c;会获得彩色图像的多种叠加效果&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;四十&#xff09;掩模&#xff1a;三通道图像的局部覆盖-CSDN博客 这时候如果更进一步&#xff0c;直接…...

Spring MVC和Spring WebFlux的区别

目录 一、编程模型 二、IO处理方式 三、数据流处理 四、适用场景 五、生态系统 在当今的Web开发领域&#xff0c;Spring框架无疑占据着重要的地位。其中&#xff0c;Spring MVC和Spring WebFlux作为Spring框架中用于构建Web应用程序的两个重要模块&#xff0c;各自具有独特…...

Linux探秘坊-------4.进度条小程序

1.缓冲区 #include <stdio.h> int main() {printf("hello bite!");sleep(2);return 0; }执行此代码后&#xff0c;会 先停顿两秒&#xff0c;再打印出hello bite&#xff0c;但是明明打印在sleep前面&#xff0c;为什么会后打印呢&#xff1f; 因为&#xff…...

Llama 3:开源大模型的里程碑式突破

标题&#xff1a;Llama 3&#xff1a;开源大模型的里程碑式突破 文章信息摘要&#xff1a; Meta通过Llama 3展现了开源LLM的重大突破&#xff1a;采用超大规模训练数据和多阶段训练方法&#xff08;SFT、rejection sampling、PPO和DPO&#xff09;&#xff0c;突破了传统的Chi…...

计算机网络 (56)交互式音频/视频

一、定义与特点 定义&#xff1a;交互式音频/视频是指用户使用互联网和其他人进行实时交互式通信的技术&#xff0c;包括语音、视频图像等多媒体实时通信。 特点&#xff1a; 实时性&#xff1a;音频和视频数据是实时传输和播放的&#xff0c;用户之间可以进行即时的交流。交互…...

STM32 GPIO工作模式

GPIO工作模式 1. GPIO简介2. GPIO工作模式2.1 输入浮空2.2 输入上拉2.3 输入下拉2.4 模拟2.5 开漏输出2.6 推挽输出2.7 开漏式复用功能2.8 推挽式复用功能 1. GPIO简介 GPIO 是通用输入输出端口的简称&#xff0c;简单来说就是 STM32 可控制的引脚&#xff0c;STM32 芯片的 GPI…...

自动化实现的思路变化

阶段一&#xff1a; 1、成功调用。第一步&#xff0c;一般是用现用的工具&#xff0c;或者脚本成功调用接口 2、解决关联接口的参数传递。有的接口直接&#xff0c;存在参数的传递&#xff0c;一般的思路&#xff0c;就是将这个参数设置为变量。 3、简化代码。总会有些东西是重…...

MongoDB的索引与聚合

一、实验目的 1. 理解索引的概念及其在MongoDB中的重要性和作用。 2. 学习如何选择适合建立索引的字段。 3. 掌握如何创建、删除索引以及如何强制使用索引。 4. 熟悉MongoDB的聚合框架和MapReduce工具&#xff0c;以及简单聚合命令的使用。 二、实验环境准备 1. JAV…...

Java菜鸟养成计划(java基础)--java运算符

java中的运算符 1、java中的运算符1.1 、 、-、 * 、/ 、 %1.2 、、-、 *、/、%1.3 、、--【自增\自减运算符】1.4、>、 <、 > 、< 、 、! 、! 1.5、&&、||、|、&1.6、&、|、~、^1.7、>> 、 <<、>>>位运算1.8、?:三目运算符…...

除了基本的事件绑定,鸿蒙的ArkUI

鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是由华为技术有限公司开发的分布式操作系统&#xff0c;旨在为多种智能设备提供一个统一的操作平台。它不仅适用于智能手机&#xff0c;还适用于平板电脑、智能手表、智能电视等物联网设备。为了使开发者能够更加便捷地创建跨设备…...

0164__【GNU】gcc -O编译选项 -Og -O0 -O1 -O2 -O3 -Os

【GNU】gcc -O编译选项 -Og -O0 -O1 -O2 -O3 -Os_gcc -o0-CSDN博客...

vue3组件传值具体使用

问&#xff1a; left.vue文件调用接口获取了后端返回的urlLink字段&#xff0c;我该怎么传递给总的父组件index.vue中&#xff0c;我需要点击父组件的一个按钮来触发跳转&#xff1f; 回答&#xff1a; 在 Vue 3 中使用 TypeScript 和 setup 语法糖时&#xff0c;可以通过 e…...

Web 音视频(二)在浏览器中解析视频

前言 浏览器中已经能直接播放视频&#xff0c;为什么还需要手动写代码解析&#xff1f; 因为&#xff0c;某些场景需要对视频进行更细致的处理&#xff0c;比如截取关键帧、提取视频中的文字、人物打码、极低延时播放视频等等。 总之&#xff0c;除了最单纯的视频播放外&…...

江天科技主要产品销售单价下滑,应收账款、存货周转率大幅下降

《港湾商业观察》廖紫雯 日前&#xff0c;苏州江天包装科技股份有限公司&#xff08;以下简称&#xff1a;江天科技&#xff09;冲击北交所&#xff0c;保荐机构为国投证券。 江天科技主要从事标签印刷产品的研发、生产与销售&#xff0c;公司主要产品包括薄膜类和纸张类的不…...

我国的金融组织体系,还有各大金融机构的分类,金融行业的组织

中国金融组织体系介绍 中国金融组织体系是一个复杂而多层次的系统&#xff0c;涵盖了各种类型的金融机构和监管机构。以下是关于中国金融组织体系的详细介绍&#xff0c;包括一行三会等金融监管机构&#xff0c;各大金融机构的分类、涉及的银行以及行业组织。 &#xff08;一…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...