登录校验的相关知识点

登录校验的相关知识点

  • 【1】会话技术
    • 1)会话:
    • 2)会话跟踪:
    • 3)常见的几种会话跟踪:
  • 【2】JWT令牌
    • 1)定义解释
    • 2)测试生成Jwt令牌并解析
    • 3)注意事项
  • 【3】过滤器Filter
    • 1)过滤器工作原理如下:
    • 2)简单使用示例
    • 3)自定义拦截路径
    • 4)疑问
    • 5)过滤器链
  • 【4】拦截器Interceptor
    • 1)定义理解
    • 2)如何使用
      • 1)定义拦截器,实现Handlerlnterceptor接口,并重写其所有方法
      • 2)注册拦截器
    • 3)拦截路径
    • 4)拦截器的执行流程

【1】会话技术

前言:也就是浏览器每一次的访问客户端,就是一次独立的会话,当是使用http协议,这是无状态的,也就是服务器不会保留关于客户端之前请求的任何信息。会话技术保留不同请求之间的数据共享,从状态管理、而可以解决一些问题:身份验证、数据一致性、状态管理

1)会话:

用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应.

2)会话跟踪:

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

3)常见的几种会话跟踪:

  • 客户端会话跟踪技术: Cookie
    • 优点: HTTP协议中支持的技术
    • 缺点:移动端APP无法使用Cookie不安全,用户可以自己禁用CookieCookie不能跨域
  • 服务端跟踪技术:Session
    • 优点:存储在服务端,安全
    • 缺点:服务器集群环境下无法直接使用Session
      Cookie的缺点
  • 令牌技术
    • 优点
      支持PC端、移动端解决集群环境下的认证问题减轻服务器端存储压力
  • http协议
    HTTP(Hypertext Transfer Protocol)协议是一种无状态协议。这意味着每个HTTP请求都是独立的,服务器不会保留关于客户端之前请求的任何信息。在无状态的HTTP协议中,服务器不能自动跟踪和管理客户端的状态。每次客户端发送请求时,服务器都需要完整地处理该请求,而不考虑之前的请求或状态。服务器不会记住客户端的身份、会话状态或其他上下文信息。

【2】JWT令牌

1)定义解释

全称:JSON Web Token JWT网址
定义了一种简洁的、自包含的格式,用于在通信双方以ison数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的

登录校验的相关知识点_第1张图片

2)测试生成Jwt令牌并解析

/**
     * 测试JWT令牌的生成
     */
    @Test
    public void testGenJwt(){
        Map<String,Object> claims=new HashMap<>();
        claims.put("id",1);
        claims.put("name","hua");

        String jwt=Jwts.builder()
                .signWith(SignatureAlgorithm.HS256,"huahhh")//签名算法,参数一:编码算法类型,参数二:签名内容
                .setClaims(claims)//自定义内容(载荷)
                .setExpiration(new Date(System.currentTimeMillis()+3600*1000)) // 设置有效期为1小时
                .compact();//得到字符串的JWT令牌

        System.out.println(jwt );
    }


    /**
     * 解析Jwt令牌
     */
    @Test
    public void testParseJwt(){
          Claims claims= Jwts.parser()
                //设置签名密钥
                .setSigningKey("huahhh")
                //传入要解析的Jwt令牌
                .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiaHVhIiwiaWQiOjEsImV4cCI6MTY5MzI3ODEyNX0.ZP-K8BAThdNMrIsYRE1O-IPdAayXwbb82kayK9ku-Js")
                //得到解析后的内容
                .getBody();


        System.out.println(claims);
    }

3)注意事项

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

【3】过滤器Filter

  • 过滤器(Filter)是一种在Java Web应用程序中用于对HTTP请求进行预处理和后处理的组件。它可以在请求到达目标资源之前对请求进行修改、验证、记录或拦截,并在响应返回给客户端之前对响应进行修改、处理或拦截。
  • 过滤器通常用于实现与请求和响应相关的共同功能,如身份验证、日志记录、字符编码转换、跨域资源共享(CORS)处理等。通过使用过滤器,可以在多个Servlet或JSP页面之间共享公共逻辑和处理流程,提高代码的重用性和可维护性。

1)过滤器工作原理如下:

  • 当HTTP请求到达Web应用程序时,服务器首先将请求发送给过滤器链中的第一个过滤器。
  • 过滤器对请求进行处理、修改或验证,并决定是否将请求传递给下一个过滤器。
  • 如果有更多的过滤器存在,请求将按照定义的顺序依次传递给下一个过滤器。
  • 最后一个过滤器将请求传递给目标资源(如Servlet或JSP页面)进行处理。
  • 处理完目标资源后,请求经过相同的过滤器链返回,但此时是按照相反的顺序通过过滤器,对响应进行修改或处理。
  • 最终响应被发送给客户端。

2)简单使用示例

  • 定义实现类实现filter接口


import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;

import java.io.IOException;

/**
 * 配置filter拦截器,需要加上@WebFilter(urlPatterns = "/*")。
 * 【1】/*表示拦截所有的请求
 * 【2】Filter是Java Servlet规范的一部分,并不是Spring Boot框架的核心内容。,需要在主类上加上注解:@ServletComponentScan
 */
@WebFilter(urlPatterns = "/*")
public class DemopFilter implements Filter {

    // 初始化方法,在过滤器被创建时调用,通常用于进行一些初始化操作,只调用一次
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
        System.out.println("init初始化方法执行了");
    }

    // 过滤方法,在每次请求到达时调用,可以对请求和响应进行处理,可以调用多次
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 在这里编写过滤的逻辑和处理代码

        // 在调用filterChain.doFilter()方法之前可以对请求进行修改或拦截

        // 调用filterChain.doFilter()方法将请求传递给下一个过滤器或目标资源(如Servlet或JSP页面)

        /**
         * 放行
         */
        filterChain.doFilter(servletRequest, servletResponse);

        // 在调用filterChain.doFilter()方法之后可以对响应进行修改或处理
        System.out.println("拦截到了请求");
    }

    // 销毁方法,在过滤器被销毁时调用,通常用于进行一些清理操作,只调用一次
    @Override
    public void destroy() {
        Filter.super.destroy();
        System.out.println("destroy方法执行了");
    }
}


  • 需要在主类上加上注解:@ServletComponentScan//开启了对Servlet组件的支持

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@ServletComponentScan//开启了对Servlet组件的支持
@SpringBootApplication
public class Web_Application {

    public static void main(String[] args) {
        SpringApplication.run(Web_Application .class, args);
    }

}

3)自定义拦截路径

登录校验的相关知识点_第2张图片

4)疑问

  • 放行后访问对应资源,资源访问完成后,还会回到Filter中吗?
  • 如果回到Filter中,是重新执行还是执行放行后的逻辑呢?执行放行后逻辑

5)过滤器链

过滤器链(Filter Chain)是由多个过滤器组成的链式结构,用于按照特定的顺序依次对HTTP请求进行处理。当一个请求到达时,它将依次经过所有注册在该过滤器链上的过滤器,直到最后一个过滤器,然后再按相反的顺序经过这些过滤器处理响应。

登录校验的相关知识点_第3张图片

【4】拦截器Interceptor

1)定义理解

拦截器(Interceptor)是在Web开发中用于对请求进行预处理和后处理的一种机制。在Spring框架中,拦截器是一种用于拦截HTTP请求和响应的组件,可以在请求进入控制器之前和离开控制器之后执行特定的操作。

与过滤器不同,拦截器是Spring框架提供的特性,并且通常与Spring MVC(Model-View-Controller)一起使用,用于对控制器的请求进行拦截和处理。拦截器主要用于实现以下功能:

  1. 预处理:在控制器方法执行之前,可以进行一些预处理操作,例如权限验证、数据准备或日志记录等。

  2. 后处理:在控制器方法执行完成后,可以对响应进行处理,例如添加公共数据、渲染视图或记录响应时间等。

  3. 异常处理:如果控制器方法抛出异常,拦截器可以捕获并处理这些异常,以进行统一的异常处理逻辑。

拦截器与过滤器的区别在于它们的运行位置和作用对象,拦截器针对的是具体的控制器方法,而过滤器则是针对URL路径的。拦截器更具有细粒度的控制能力,可以对特定的控制器方法进行拦截和处理。

2)如何使用

1)定义拦截器,实现Handlerlnterceptor接口,并重写其所有方法

实现该类的时候需要在类上加上注解:@Component,表示把该类的对象交给IOC容器管理,方便注册拦截器的时候可以直接声明该变量。

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    //日标资源方法运行前运行,返回true: 放行,可以执行控制层代码;返回false, 不放行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle......");
        return true;
    }

    //标资源方法运行后运行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle......");
    }

    //视图渲染完毕后运行,最后运行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion......");
    }
}

2)注册拦截器

import com.example.interceptor.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @Configuration该注解表示是配置类
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {

    //使用 @Autowired 注解从 IOC(Inversion of Control)容器中获取 LoginCheckInterceptor 的 bean 对象,以便后续注册拦截器。
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;
    //重写addInterceptors方法注册一个拦截器
    //使用 registry.addInterceptor 方法将 loginCheckInterceptor 拦截器添加到拦截器链中。
    //使用 addPathPatterns 方法指定拦截的路径规则。此处的 "/*" 表示拦截所有的请求路径。
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册拦截器,并拦截所有的路径请求资源
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");
    }
}

3)拦截路径

登录校验的相关知识点_第4张图片

4)拦截器的执行流程

登录校验的相关知识点_第5张图片

你可能感兴趣的:(JAVAWeb,java,spring,boot,servlet,后端)