登录操作
前言:++在完成这个登录页面时,所有人都可以进入到我们设计的这个页面,非常的不安全,这时我们在登陆页面设置了根据数据库存在的用户名和密码进行校验,如果数据库存在这个用户,就可以成功访问,这样就大大增加了安全性。++
++核心逻辑就是根据前端传递来的JSON数据,Http请求到达服务器,++
Controller层:
我们重新创建一个登陆的controller层 logincontroller。在这里我们使用个@PostMapping @RequestBody注解
登录页面使用@RequestBody Emp emp是Spring MVC处理HTTP请求的一种方式。让我详细解释:
@RequestBody 的作用
@RequestBody注解告诉Spring MVC框架:
从HTTP请求的body中读取数据
将数据自动转换 为指定的Java对象(这里是Emp类)
这个转换过程由Spring的HttpMessageConverter完成
数据封装流程:
前端JSON数据 → HTTP请求Body → Spring解析 → Emp对象
注解本身没有执行逻辑,它们的作用是:
-
标记:告诉框架"这个参数/方法需要特殊处理"
-
配置 :提供一些配置选项(如
required=true) -
触发:框架看到这些注解后,会调用相应的处理器
JSON数据的解析:
Spring MVC自动解析,我们直接使用
@PostMapping("/login")
public Result login(@RequestBody Emp emp) {
// 到这里时,JSON已经被Spring MVC自动解析成Emp对象了
// 我们可以直接使用!
System.out.println(emp.getUsername());
return Result.success();
}

@RestController 带来的特性:
-
自动序列化:方法返回值自动转为JSON
-
无视图渲染:不进行JSP/Thymeleaf视图解析
-
适合API:专为RESTful API设计
-
简化代码 :不需要每个方法都加
@ResponseBody
@RestController 是 Spring 为 RESTful Web 服务 提供的专门注解:
-
本质 :
@Controller + @ResponseBody的组合 -
作用:标记类为 REST 控制器,自动将返回值序列化为 JSON/XML
-
适用场景:前后端分离、移动端 API、微服务等需要返回数据的场景
-
优势:代码简洁、专注于数据、适合现代 Web 开发
它让开发 RESTful API 变得非常简单,是 Spring Boot 项目中最常用的控制器注解。
LoginController

其他的层面跟前面类似
详解Emp e=empService.login(emp);
Emp → 这是一个类(视图对象),用于封装返回给前端的数据
e → 变量名,用来接收方法返回的结果
= → 赋值操作符
empService → Service层的实例对象
.login() → 调用empService的login方法
(emp) → 传入参数,就是前端传来的登录数据
; → 语句结束
然而,经过前后端的联调测试,发现即使用户没有登录,也能直接进入到页面,这是一个bug,我们后端仅仅做的是查询数据库中是否有这个数据,而没有判断用户是否登录。这时我们就需要学习登录校验 技术
登录校验:
会话技术
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
会话跟踪方案:
客户端会话跟踪技术:Cookie
服务端会话跟踪技术:Session
令牌技术
Cookie:
优点:HTTP协议中支持的技术
缺点:移动端APP无法使用Cookie不安全,用户可以自己禁用CookieCookie不能跨域
Session
优点:存储在服务端,安全
缺点:
服务器集群环境下无法直接使用Session
Cookie的缺点
令牌技术
优点:
支持PC端、移动端
解决集群环境下的认证问题减轻服务器端存储压力
缺点:需要自己实现
JWT
简介
全称: JSON Web Token (https://jwt.io/)
定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。
组成:
第一部分:Header(头),记录令牌类型、签名算法等。例如:("alg":"HS256","type":"JWT")
第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。例如:("id":"1","username":"Tom")
第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。
Base64:是一种基于64个可打印字符(A-Z a-z0-9+/)来表示二进制数据的编码方式。
场景:登录认证。
登录成功后,生成令牌
后续每个请求,都要携带WT令牌,系统在每次请求处理之前,先校验令牌,通过后,再处理
添加依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version></dependency>
生成令牌:

校验令牌:

注意事项
JWT校验时使用的签名秘钥,必须和生成WT令牌时使用的秘钥是配套的。
如果WT令牌解析校验时报错,则说明JWT令牌被篡改或失效了,令牌非法。
改写之后

那么我们完成了这些,同时也产生了新的问题,我们如何去统一的拦截这些令牌呢?
过滤器(Filter)
目概述
概念:Filter 过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。
步骤
Filter快速入门
1.定义Filter:定义一个类,实现Filter接口,并重写其所有方法。
2.配置Filter:Filter类上加@WebFilter 注解,配置拦截资源的路径。引导类上加 @ServletComponentscan开启Servlet组件支持。
放行后访问对应资源,资源访问完成后,还会回到Filter中吗?会
如果回到Filter中,是重新执行还是执行放行后的逻辑呢?执行放行后逻辑

过滤器链
介绍:一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链。
-
调用
chain.doFilter()= "请继续处理这个请求" -
不调用
chain.doFilter()= "到此为止,不再处理" -
调用时机 = 在你完成检查/处理后
-
调用之后 = 你的过滤器会"暂停",等响应返回
这就是为什么我们常说:"过滤器决定是否放行请求"。放行就是调用 chain.doFilter(),不放行就是不调用它直接返回。

servlet是什么:
Servlet是程序,不是数据
DispatcherServlet是Spring MVC的入口
它接收所有请求,然后分发给对应的Controller
Controller才是真正"处理数据"的地方
"最终的Servlet"就像公司的前台总机,所有来电都先到这里,然后前台转接到对应的部门(Controller)。
所有的请求,拦截到了之后,都需要校验令牌吗?有一个例外,登录请求
拦截到请求后,什么情况下才可以放行,执行业务操作?有令牌,且令牌校验通过(合法);否则都返回未登录错误结果
登录校验Filter-流程
实现的目的就是:就是在页面中,如果还未登录在查询其他的 业务时,会自动跳转到登录页面。
步骤
获取请求url。
判断请求url中是否包含login,如果包含,说明是登录操作,放行。
获取请求头中的令牌(token)。
判断令牌是否存在,如果不存在,返回错误结果(未登录)。
解析token,如果解析失败,返回错误结果(未登录)。
放行。
拦截器(Interceptor)
概念:是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截控制器方法的执行。
作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。
1.定义拦截器,实现Handlerlnterceptor接口,并重写其所有方法。
2.注册拦截器

配置类

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


全局异常处理器
@RestControllerAdvice
@ExceptionHandler
