黑马2023Javaweb(12)|案例(登录功能、登录校验、异常处理)

1650b851c01f4afcaaf291592e724bda.png

一:登录功能

根据用户名与密码查询用户,查询到了,登录成功;查询不到,登陆失败

1.需求分析:

f2c865fa1cb044ffbf4c0e1438c819aa.png

8a6be5d301634265a90bc685b45cbe1e.png

e52375ab507c4a6c8aefeb77bd304f3c.png

46e9230ce8634613a02fa54c5b9f1a33.png

1c3aced11ffc40e5991e243b3b8dee2b.png

2.思路分析:

3fc3b29a6e664c45ab9e74840a7f8cac.png

sql语句

cd64882f0f9b4a459b0c6dc47b317261.png

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);

cbc3c4fdfd3e4b3097c7f1253c53e6f6.png

二:登录校验

登录校验:操作depts,emps页面时,先进行校验是否登录了,如果登录,正常操作;否则返回错误码,跳转登录页面

1.存在问题与解决方法

1.1问题

未登录情况下,也可以方法

3cefa558015a4b34a225c4cfadfe3556.png

1.2 方法:登录校验

035ae0b719d24815a9650124477f5b87.png

(1)登陆标记--会话技术

给每一次操作,先判断是否登录,如果没有,则返回前端一个错误信息,前端会自动跳转到登录页面。--- 会话技术--作用:用户登录成功后,每一次请求都可以获得该标记(登陆成功的标记)

f60e0b50068c4afd8dd2e93dc25ba771.png

(2)统一拦截

但是该操作,统一而繁琐---统计拦截技术解决

拦截所有请求,然后去获取标记,获得了,放行;没有,就返回错误信息

2.会话技术

2.1.概述(会话技术,会话跟踪)

16cdffdd11104ac0a43c4cb9dfd37f9a.png

会话技术,浏览器与服务器之间的连接,浏览器与服务器第一次请求响应就建立会话,直到该浏览器所有请求结束,会话结束。重点:一次会话可以包含多次请求与响应

问题:浏览器与服务器的请求响应 基于 http协议,该协议是无状态的,不同请求之间是独立的。服务无法识别那些请求是源于同一会话。---解决方法:会话跟踪

会话跟踪:重点。服务器识别多次请求是否来自同一浏览器,以便在同一次会话中多次请求共享数据

2.2会话跟踪方案对比

【Java Web】012 -- SpringBootWeb综合案例(登录功能、登录校验、异常处理)_javaweb 设置登录信息失效返回用户信息失效-CSDN博客

(1)Cookie

浏览器第一次访问时,服务器会响应一个cookie在响应数据里,浏览器将其保存至本地。后来每次请求,会将此cookie作为请求部分(cookie请求体)发送到后端

直到浏览器结束请求。实现会话跟踪

6fe5de833a274ea1941dbecf402e83b7.png

3bc69b8b602340669760565a06fa0a05.png

bfd909b935ef4bce91a7860440242295.png

(2)Session

基于cookie的方法,Cookie值为Jsessionid码

4e91c8212fb7494f9f17e2d8e7e46c50.png

b1924c82546c4cee87ee71279db8cb77.pngdd20288231c0456b95a3121e74f2eaca.png

(3)令牌技术(主流方案)

在login请求时,服务器端生成令牌,响应给浏览器。浏览器保存至本地,下面每次请求,将其携带为请求体,发送到服务器。服务器核验令牌真伪,真,可继续访问其他页面(不同请求间共享资源)

61460d8101844b75848a4027860733fe.png

3.JWT令牌

3.1概述

数字签名部分是根据前面的(header,  Payload)签名算法计算得来的,而不是Base64编码。

前面一变,数字签名改变---JWT令牌安全可靠的

前面两部分是基于Base64编码的,是明文

后面的数字签名是加密的,无法解析--JWT令牌安全可靠的原因

1b99f11d9b764e6dbe7381ba7240d0af.png

3.2应用场景

登录认证:分为两步---生辰令牌与校验令牌

c77ce121cf584855b763fd2f5b9efedc.png

3.3生成JWT令牌

4af90520e929465190960946843aeb39.png

Step1:导入依赖

Pom.xml文件

f8f4bfe1236445e7a13c4542fc485ce3.png

Step2:Test文件添加测试方法(生成JWT)

1c45687530f548cc8c37df3da78ddd1c.png

7d615a1d20b24059a5098d65f38d82e8.png

自定义内容

c7f4e719508d4cce8c10ade662a36f0d.png

3.4校验JWT令牌

3fc06cd4e41248289f5db9888f2bf3d2.png

生成时的签名密钥:

bd10a7e3fb294e24863f5a1ce839129e.png

示例:

a1df692f1af04b7086013401861fd302.png

85357ce7042b486b85de5b7eef2669e6.png

3.5 登录后下发令牌(响应令牌给前端)

(1)目标:响应JWT数据

d5efdeaabfdb45ba89b553f7dc75fcc2.png

4513651a8c5646659c60ea2ce31bffdb.png

(2)代码实现

18a14a8451ff4c01b35035fa378c1f33.png

7d929b5c168744259d15e24d99396e71.png

4.过滤器Filter

(统一校验JWT令牌,拦截请求或放行请求

两种方法:过滤器Filter   或  拦截器Interceptor )

4.1 概述(为什么引入)

之前:每次请求在depts,emps都要校验JWT令牌,代码(操作是相同的),繁琐。

引入过滤器Filter,将depts与emps中的校验转到Filter中执行。只有一个代码,简化

a1ff9f2f808640948a8ce9a0bfba6e09.png

c77ec2eecf9f47e1811d0f6317832236.png

4.2快速入门

53f487357ee84bd095fdeb66ef769c9a.png

(1)定义一个类,实现Filter接口

7e42f04fd3ee4d47aa9960b29752fb53.png

(2)重写方法

默认只需要重写doFilter方法,拦截请求。

de9a6f1311874668aef12964f5b59efa.png

9588fd278ec1482b8d8dbf6f77894ba8.png

(3)配置Filter

Filter类上加 @WebFilter注解,配置拦截资源的路径

a794f29aea60425597d206b29cc8723c.png

引导类上加@ServletComponentScan开启Servlet组件支持:

c2b9ce36ccea4e329e313122fa62103c.png

608c24bb5f5e40239e9c3a589de38b27.png

(4)在doFilter方法中放行请求

只有放行了,才能访问到emps页面,否则全部都被拦截了。

39c0639f99e14d36bcf3f500be6c7f23.png

(5)小结

284eea60028c4fa695dc95639abab807.png

4.3详解

(1)执行流程

f4eb2b857d7d49ce9dccc04d855298b9.png

17b398245f6143928cf7f224a86c47d7.png

(2)拦截路径

967fbf14c6b44be0a67cf3e068031795.png

(3)过滤器链

第一个过滤器放行后,还不能进入后端,要再进入第二个过滤判断

a728383c66e640598e8f4be1d9ebd3ab.png

优先级跟类名字典序有关

Abc 字典序大于 Demo(A>D)

958a281af527499da806cdaea227cef0.png

8703bb64cb1f481e8aa5dbc45ce69c80.png

小结

346011c81a8e4c1abae7f3b3232104e0.png

4.4 登录校验

6b4e17ec30e34ff1b01085081c912db1.png

(1)流程

50c18692f1cd4cd18508407c0d14c34f.png

(2)代码实现

8b5fb770f5e24f31a7cde40ce58c118f.png

a.b.获取请求路径,判断是否为登录页面

cf572ef2bc1e4818915d756679b60318.png

c.获取亲求头中的令牌

0170ed80583245e9a1ab84be3a7d04d2.png

85705cac32f744cea11479f2c94bdbb8.png

d.判断令牌存在?--不存在

7f3678d4e9d640d2a808abad526ab2ac.png

返回的错误信息:

f0f38b042dac412eb7f8d557c7648f6c.png

将错误信息封装为JSON格式,返回给响应数据resp

导入依赖:

dcd97b8799a745f587419ed54f483a08.png

e.令牌存在,但错误

34f6522c67984ccc88af8818159611c4.png

放行,给下一条过滤器

5551d618129f4315bf21a46fac719081.png

5.拦截器Interceptor

02398777d52a43e2a8e9306fae384cee.png

5.1 概述

2e1e07ff67d24741a7be445a889094b8.png

5.2 快速入门

3fe595811d0244e8aa2ffca523c7fe5e.png

(1)定义拦截器,实现接口

93def8f9004641ef908d660dc4ccfc2c.png

(2)重写方法

7a4b6b3836a74981ae61669150f24bf4.png

(3)注册拦截器

定义拦截器,交给IOC容器管理

28ee384a99ef45fcb29bcb3a94814b1f.png

配置拦截器

103d58991562455e98256cb8f2834703.png

5.3详解

(1)拦截路径

0948b382e4df4e589aa6ddc95962fbc3.png

(2)执行流程

Filter在spring外

448c5e12e09048c78a22ca9eb95431e2.png

(3)过滤器与拦截器区别

1a0b1fca97aa47dd85ae383ab6604a11.png

5.4登录校验

9fc84036b0664b939d16d5cf9e58959e.png

acb7fbaae2fc4d19a3b97186873818ff.png

三:异常处理

1.出现异常的不符合规范数据

程序开发中出现异常,异常没有被处理,直接作为响应数据返回给前端。异常是非Result格式,前端无法处理

50d2cc5b845940748d28d9d33f42ccef.png

e0c19bab98284057b80148348bfea63e.png

fa61d802545b4016a6667333f16ab75e.png

2.全局异常处理器

94b2259a22d3426c8dc7566b6c660e38.png

3.代码实现

3244365a0a6247bb9b41a2ea56da92b3.png

5a27d301860c4d7980b63a48200fd378.png

4.小结

第一个在 全局异常处理器 类上添加的

第二个在方法上添加,指明需要捕获哪一类异常

507dcffa4b514fc5a8f4f4aeafec1c6a.png

f7502a26e48b4760b0a6b8d712132b91.png

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值