登录校验,会话技术,Cookie,Session,JWT令牌,统一拦截技术,过滤器FIlter,拦截器Interceptor,全局异常处理器

目录

    • 1 登录校验
    • 2 会话技术
      • 2.1 会话技术介绍
      • 2.2 Cookie
      • 2.2 Session
      • 2.4 令牌技术
      • 2.5 JWT令牌
        • 2.5.1 介绍
        • 2.5.2 生成和校验
        • 2.5.3 登录下发令牌
    • 3 统一拦截技术
      • 3.1 过滤器Filter
        • 3.1.1 过滤器的使用步骤
        • 3.1.2 代码实现
        • 3.1.3 细节
      • 3.2 拦截器Interceptor
        • 3.2.1 拦截器的使用步骤
        • 3.2.2 代码实现
        • 3.2.3 细节
    • 4 登录功能具体实现步骤
    • 5 异常处理
      • 5.1 异常的解决方案
      • 5.2 全局异常处理器

1 登录校验

所谓登录校验,指的是我们在服务器端接收到浏览器发送过来的请求之后,首先我们要对请求进行校验。先要校验一下用户登录了没有,如果用户已经登录了,就直接执行对应的业务操作就可以了;如果用户没有登录,此时就不允许他执行相关的业务操作,直接给前端响应一个错误的结果,最终跳转到登录页面,要求他登录成功之后,再来访问对应的数据。

我们要完成以上操作,会涉及到web开发中的两个技术:

  1. 会话技术
  2. 统一拦截技术

而统一拦截技术现实方案也有两种:

  1. Servlet规范中的Filter过滤器
  2. Spring提供的interceptor拦截器

2 会话技术

2.1 会话技术介绍

  • 会话:在web开发当中,会话指的就是浏览器与服务器之间的一次连接,我们就称为一次会话。

需要注意的是:会话是和浏览器关联的,当有三个浏览器客户端和服务器建立了连接时,就会有三个会话。同一个浏览器在未关闭之前请求了多次服务器,这多次请求是属于同一个会话。

  • 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。

使用会话跟踪技术就是要完成在同一个会话中,多个请求之间进行共享数据。

共享数据的原因:
由于HTTP是无状态协议,要在后面请求中拿到前一次请求生成的数据,就需要在一次会话的多次请求之间进行数据共享

会话跟踪技术有两种:

  1. Cookie(客户端会话跟踪技术)
  2. Session(服务端会话跟踪技术)
  3. 令牌技术

2.2 Cookie

cookie 是客户端会话跟踪技术,它是存储在客户端浏览器的

  • 响应头 Set-Cookie :设置Cookie数据的
  • 请求头 Cookie:携带Cookie数据的

优缺点

  • 优点:HTTP协议中支持的技术
  • 缺点:
    • 移动端APP(Android、IOS)中无法使用Cookie
    • 不安全,用户可以自己禁用Cookie
    • Cookie不能跨域

区分跨域的维度:
只要以下的三个维度有任何一个维度不同,那就是跨域操作

  • 协议
  • IP/协议
  • 端口

2.2 Session

Session,它是服务器端会话跟踪技术,所以它是存储在服务器端的

  • 获取Session

  • 响应Cookie (JSESSIONID)

  • 查找Session

优缺点

  • 优点:Session是存储在服务端的,安全
  • 缺点:
    • 服务器集群环境下无法直接使用Session
    • Cookie的所有缺点

2.4 令牌技术

令牌,其实它就是一个用户身份的标识,本质就是一个字符串。

优缺点

  • 优点:
    • 支持PC端、移动端
    • 解决集群环境下的认证问题
    • 减轻服务器的存储压力(无需在服务器端存储)
  • 缺点:需要自己实现(包括令牌的生成、令牌的传递、令牌的校验)

2.5 JWT令牌

前面我们介绍了基于令牌技术来实现会话追踪。这里所提到的令牌就是用户身份的标识,其本质就是一个字符串。令牌的形式有很多,我们使用的是功能强大的 JWT令牌。

2.5.1 介绍

JWT全称:JSON Web Token

  • 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。

    简洁:是指jwt就是一个简单的字符串。可以在请求参数或者是请求头当中直接传递。

    自包含:指的是jwt令牌,看似是一个随机的字符串,但是我们是可以根据自身的需求在jwt令牌中存储自定义的数据内容。如:可以直接在jwt令牌中存储用户的相关信息。

JWT的组成: (JWT令牌由三个部分组成,三个部分之间使用英文的点来分割)

  • 第一部分:Header(头), 记录令牌类型、签名算法等

  • 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等

  • 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。

JWT通过base64编码将原始的JSON格式数据,转变为字符串?
base64编码:是一种基于64个可打印的字符来表示二进制数据的编码方式。

2.5.2 生成和校验

JWT令牌的生成。
先引入JWT的依赖:


<dependency>
    <groupId>io.jsonwebtokengroupId>
    <artifactId>jjwtartifactId>
    <version>0.9.1version>
dependency>

在引入完JWT来赖后,就可以调用工具包中提供的API来完成JWT令牌的生成和校验

工具类:Jwts

生成JWT代码实现:

@Test
public void genJwt(){
   
    Map<String,Object> claims = new HashMap<>();
    claims.put("id",1);
    claims.put("username","Tom");
    
    String jwt = Jwts.builder()
        .setClaims(claims) //自定义内容(载荷)          
        .signWith(SignatureAlgorithm.HS256, "itheima") //签名算法        
        .setExpiration(new Date(System.currentTimeMillis

你可能感兴趣的:(springboot,spring,boot,web,java)