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

JavaWeb 课堂笔记 —— 21 登录认证

本文介绍了Tlias智能学习辅助系统的登录功能实现与登录校验机制。

登录功能通过POST请求验证用户名密码,成功后发放JWT令牌;登录校验采用统一拦截方式,通过JWT令牌验证用户状态。同时对比了两种会话跟踪技术:客户端Cookie和服务端Session,分别展示了设置和获取方法。文章还提供了SQL查询语句、接口测试结果和代码实现示例,完整呈现了系统认证模块的开发流程。

01 登录功能

① 需求

登录Tlias智能学习辅助系统,成功后,系统下发JWT令牌

在这里插入图片描述

sql语句:查询员工并验证usernamepassword,其中usernameunique唯一性。

select * from emp where username = 'jinyong' and password = '123456';

请求路径:/login

请求方式:POST

请求样例:

{
"username":"jinyong",
“password":"123456"
}

响应样例:

{
"code":1,
"msg":"success",
"data":
"eyJhbGcioiJIUzI1Ni]9.eyJuYw11Ijoi6YeR5bq4IiwiawQiojEsInVzZXJuYW11IjoiamlueW9uZzyIsImV4cCI6MTY2MjIWNzA0OH0.KkUc_CXJZJ8Dd063eImx4H90jfrr6XMJyVzaWCVZCo"
}
② 思路

创建一个新的controller文件,添加注解@PostMapping@RequestBodyjson格式数据),登录操作的是员工信息,借助EmpService.javaEmpMapper.java实现,返回登录成功或失败。

在这里插入图片描述

③ 牛马开发

在这里插入图片描述

Postman 测试

在这里插入图片描述

⑤ 前后端联调测试

在这里插入图片描述

02 登录校验

① 需求

该页面存在隐患,用户不用输入用户名和密码就可以直接访问到系统界面,安全性低。需在用户访问界面时自动进行是否登录的判断。若登录,则继续访问;若未登录,则跳转到登录页面。

在这里插入图片描述

② 思路

浏览器与服务器之间交互基于http协议,其是无状态协议,即每次请求都是独立的,下一次请求不会携带上一次请求的数据。

解决方案:

Ⅰ 在所有Controller接口前加入判断是否登录的操作

Ⅱ 登录之后发放JWT令牌作为登录标记,每次访问界面时,Web服务器获取登录标记进行统一拦截(过滤器Filter、拦截器Intercepter

在这里插入图片描述

03 传统web会话技术

会话:用户打开浏览器来访问web服务器的资源,会话建立;某方断开连接,会话结束。一次会话包含多次请求和响应。

在这里插入图片描述
在这里插入图片描述

会话跟踪:一种维护浏览器状态的方法,通过识别多次请求是否来自同一浏览器,来实现一次会话内部数据共享

① 客户端(浏览器)会话跟踪技术:Cookie

在这里插入图片描述

SessionController.java测试文件

package com.itheima.controller;import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;/*** HttpSession演示*/
@Slf4j
@RestController
public class SessionController {//设置Cookie(对应 3 → 4 操作)@GetMapping("/c1")public Result cookie1(HttpServletResponse response){response.addCookie(new Cookie("login_username","itheima")); //设置Cookie/响应Cookiereturn Result.success();}//获取Cookie(对应 1 → 2 操作)@GetMapping("/c2")public Result cookie2(HttpServletRequest request){Cookie[] cookies = request.getCookies();for (Cookie cookie : cookies) {if(cookie.getName().equals("login_username")){System.out.println("login_username: "+cookie.getValue()); //输出name为login_username的cookie}}return Result.success();}
}

设置cookie

在这里插入图片描述

获取cookie

在这里插入图片描述

优点:http官方支持

缺点:手机软件无法使用、用户随意禁用Cookie、无法跨域(协议、IP地址/域名、端口号)

在这里插入图片描述

② 服务端会话跟踪技术:Session

在这里插入图片描述

package com.itheima.controller;import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;/*** HttpSession演示*/
@Slf4j
@RestController
public class SessionController {//先手@GetMapping("/s1")public Result session1(HttpSession session){log.info("HttpSession-s1: {}", session.hashCode());session.setAttribute("loginUser", "tom"); //往session中存储数据return Result.success();}//后手@GetMapping("/s2")public Result session2(HttpServletRequest request){HttpSession session = request.getSession();log.info("HttpSession-s2: {}", session.hashCode());Object loginUser = session.getAttribute("loginUser"); //从session中获取数据log.info("loginUser: {}", loginUser);return Result.success(loginUser);}
}

session中存储数据:

在这里插入图片描述

session中获取数据:
在这里插入图片描述

Console控制台:

在这里插入图片描述

优点:服务端存储

缺点:服务器集群不支持、Cookie所有缺点

③ 令牌技术

在这里插入图片描述

优点:支持PC端、移动端、支持服务器集群、减轻服务端存储

缺点:自己实现

04 JWT令牌

JWT(JSON Web Token)令牌定义了一种简介的、自包含的格式,用于在通信双方以json数据格式安全的传递信息。

① 组成

在这里插入图片描述

在这里插入图片描述

② 应用场景:登录认证

登录成功后,生成令牌,后续每个请求,都要携带WT令牌,系统在每次请求处理之前,先校验令牌,通过后,再处理。

③ 生成JWT令牌

在这里插入图片描述

TliasWebManagementApplicationTests.java

	/*** 生成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,"itheima") //签名算法.setClaims(claims)//有效期一小时.setExpiration(new Date(System.currentTimeMillis() + 3600*1000)) .compact(); //JWT令牌System.out.println(jwt);}

Console

eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiVG9tIiwiaWQiOjEsImV4cCI6MTc0OTgxMTMwMH0.GMAJ0yF9jNMzO5jhrQ4QHYzjCi9X-4MpD8OmvG1eSlo

在这里插入图片描述

④ 解析JWT令牌

在这里插入图片描述

TliasWebManagementApplicationTests.java

	@Testpublic void testParseJwt(){Claims claims = Jwts.parser()//密钥.setSigningKey("itheima")//JWT令牌.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiVG9tIiwiaWQiOjEsImV4c"+"CI6MTc0OTgxMTMwMH0.GMAJ0yF9jNMzO5jhrQ4QHYzjCi9X-4MpD8OmvG1eSlo")//第二部分.getBody();System.out.println(claims);}

Console

{name=Tom, id=1, exp=1749811300}

注:ⅠJWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的密钥是配套的

Ⅱ 如果JWT令牌解析校验时报错,则说明JWT令牌被篡改或失效了,令牌非法

⑤ 返回JWT令牌

05 牛马开发

引入JWT令牌操作工具类,登录完成后,调用工具生成JWT令牌,并返回。

LoginController.java

@Slf4j
@RestController
public class LoginController {//注入EmpService对象@Autowiredprivate EmpService empService;@PostMapping("/login")//username和password由emp实体类接收即可//@RequestBody将json格式数据封装为emp实体类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());JwtUtils.generateJwt(claims); //jwt包含当前登录的员工信息return Result.success();}//登录失败,返回错误信息return Result.error("用户名或密码错误");}
}

06 Postman测试

在这里插入图片描述

07 前后端联调测试

在这里插入图片描述

http://www.dtcms.com/a/418855.html

相关文章:

  • 凤岗网站设计云南哪里可以制作自己的网页
  • Kafka07-集成-尚硅谷
  • Windows 11 WSL2 迁移到非系统盘(E 盘)教程
  • 逻辑回归与神经网络:本质联系与核心区别
  • 哈尔滨建站在线咨询龙之网官网
  • 顺德做营销网站公司wordpress 会员 按月
  • 微程序控制器
  • 零基础学AI大模型之Prompt提示词工程
  • mysql基础【基础概念与数据模型】
  • Windows系统Web UI自动化测试学习系列4--开源系统平台测试项目环境部署搭建
  • 深入理解 C++ 中的 `std::bind`:功能、用法与实践
  • 具有营销型网站有哪些长沙市建设局网站
  • 对于网站建设的提问海陵区建设局网站
  • QML学习笔记(十七)QML的属性变更信号
  • JavaWeb 课堂笔记 —— 23 事务管理
  • 一阶微分方程求解方法详解:构建系统学习笔记
  • display ip routing-table protocol ospf 概念及题目
  • 河北邯郸建网站大学网站建设的目标与思路
  • Python学习历程——基础语法(print打印、变量、运算)
  • 【从零开始学习RabbitMQ】
  • Kafka08-优化-尚硅谷
  • 小杰深度学习(two)——全连接与链式求导
  • vue警告:Extraneous non-props attributes (class) were passed to component
  • 记录第一次搭建ELK+filebeat环境
  • 【复习】计网每日一题--多播
  • 狮山网站开发wordpress轩小程序
  • Ubuntu22.04——配置固定IP
  • 记Bugku CTF平台解题过程
  • OceanBase主备库日志传输服务
  • React-props的children属性