一:登录功能
根据用户名与密码查询用户,查询到了,登录成功;查询不到,登陆失败
1.需求分析:
2.思路分析:
sql语句
3.代码实现
新建的Controller层
//Controller @Slf4j @RestController public class LoginController { @Autowired private EmpService empService; @PostMapping("/login") public Result login(@RequestBody Emp emp){ Emp emp1 = empService.login(emp); return emp1==null?Result.error("用户名或密码错误"):Result.success(); } }
业务层service与数据层用的Emp员工管理的
// Empservice层 //接口类 Emp login(Emp emp); //登录 //实现类 @Override public Emp login(Emp emp) {//登录 //Emp emp2=empMapper.login(emp.getUsername(),emp.getPassword()); Emp emp2=empMapper.login(emp); return emp2; } //Empmapping层 @Select("select * from tial.emp where username=#{username} and password=#{password}") Emp login(Emp emp);
二:登录校验
登录校验:操作depts,emps页面时,先进行校验是否登录了,如果登录,正常操作;否则返回错误码,跳转登录页面
1.存在问题与解决方法
1.1问题
未登录情况下,也可以方法
1.2 方法:登录校验
(1)登陆标记--会话技术
给每一次操作,先判断是否登录,如果没有,则返回前端一个错误信息,前端会自动跳转到登录页面。--- 会话技术--作用:用户登录成功后,每一次请求都可以获得该标记(登陆成功的标记)
(2)统一拦截
但是该操作,统一而繁琐---统计拦截技术解决
拦截所有请求,然后去获取标记,获得了,放行;没有,就返回错误信息
2.会话技术
2.1.概述(会话技术,会话跟踪)
会话技术,浏览器与服务器之间的连接,浏览器与服务器第一次请求响应就建立会话,直到该浏览器所有请求结束,会话结束。重点:一次会话可以包含多次请求与响应
问题:浏览器与服务器的请求响应 基于 http协议,该协议是无状态的,不同请求之间是独立的。服务无法识别那些请求是源于同一会话。---解决方法:会话跟踪。
会话跟踪:重点。服务器识别多次请求是否来自同一浏览器,以便在同一次会话中多次请求共享数据
2.2会话跟踪方案对比
【Java Web】012 -- SpringBootWeb综合案例(登录功能、登录校验、异常处理)_javaweb 设置登录信息失效返回用户信息失效-CSDN博客
(1)Cookie
浏览器第一次访问时,服务器会响应一个cookie在响应数据里,浏览器将其保存至本地。后来每次请求,会将此cookie作为请求部分(cookie请求体)发送到后端
直到浏览器结束请求。实现会话跟踪
(2)Session
基于cookie的方法,Cookie值为Jsessionid码
(3)令牌技术(主流方案)
在login请求时,服务器端生成令牌,响应给浏览器。浏览器保存至本地,下面每次请求,将其携带为请求体,发送到服务器。服务器核验令牌真伪,真,可继续访问其他页面(不同请求间共享资源)
3.JWT令牌
3.1概述
数字签名部分是根据前面的(header, Payload)签名算法计算得来的,而不是Base64编码。
前面一变,数字签名改变---JWT令牌安全可靠的
前面两部分是基于Base64编码的,是明文
后面的数字签名是加密的,无法解析--JWT令牌安全可靠的原因
3.2应用场景
登录认证:分为两步---生辰令牌与校验令牌
3.3生成JWT令牌
Step1:导入依赖
Pom.xml文件
Step2:Test文件添加测试方法(生成JWT)
自定义内容
3.4校验JWT令牌
生成时的签名密钥:
示例:
3.5 登录后下发令牌(响应令牌给前端)
(1)目标:响应JWT数据
(2)代码实现
4.过滤器Filter
(统一校验JWT令牌,拦截请求或放行请求
两种方法:过滤器Filter 或 拦截器Interceptor )
4.1 概述(为什么引入)
之前:每次请求在depts,emps都要校验JWT令牌,代码(操作是相同的),繁琐。
引入过滤器Filter,将depts与emps中的校验转到Filter中执行。只有一个代码,简化
4.2快速入门
(1)定义一个类,实现Filter接口
(2)重写方法
默认只需要重写doFilter方法,拦截请求。
(3)配置Filter
Filter类上加 @WebFilter注解,配置拦截资源的路径
引导类上加@ServletComponentScan开启Servlet组件支持:
(4)在doFilter方法中放行请求
只有放行了,才能访问到emps页面,否则全部都被拦截了。
(5)小结
4.3详解
(1)执行流程
(2)拦截路径
(3)过滤器链
第一个过滤器放行后,还不能进入后端,要再进入第二个过滤判断
优先级跟类名字典序有关
Abc 字典序大于 Demo(A>D)
小结
4.4 登录校验
(1)流程
(2)代码实现
a.b.获取请求路径,判断是否为登录页面
c.获取亲求头中的令牌
d.判断令牌存在?--不存在
返回的错误信息:
将错误信息封装为JSON格式,返回给响应数据resp
导入依赖:
e.令牌存在,但错误
放行,给下一条过滤器
5.拦截器Interceptor
5.1 概述
5.2 快速入门
(1)定义拦截器,实现接口
(2)重写方法
(3)注册拦截器
定义拦截器,交给IOC容器管理
配置拦截器
5.3详解
(1)拦截路径
(2)执行流程
Filter在spring外
(3)过滤器与拦截器区别
5.4登录校验
三:异常处理
1.出现异常的不符合规范数据
程序开发中出现异常,异常没有被处理,直接作为响应数据返回给前端。异常是非Result格式,前端无法处理
2.全局异常处理器
3.代码实现
4.小结
第一个在 全局异常处理器 类上添加的
第二个在方法上添加,指明需要捕获哪一类异常