登录校验的相关知识点
- 【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数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的
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)自定义拦截路径
4)疑问
- 放行后访问对应资源,资源访问完成后,还会回到Filter中吗?
会
- 如果回到Filter中,是重新执行还是执行放行后的逻辑呢?
执行放行后逻辑
5)过滤器链
过滤器链(Filter Chain)是由多个过滤器组成的链式结构,用于按照特定的顺序依次对HTTP请求进行处理。当一个请求到达时,它将依次经过所有注册在该过滤器链上的过滤器,直到最后一个过滤器,然后再按相反的顺序经过这些过滤器处理响应。
【4】拦截器Interceptor
1)定义理解
拦截器(Interceptor)是在Web开发中用于对请求进行预处理和后处理的一种机制。在Spring框架中,拦截器是一种用于拦截HTTP请求和响应的组件,可以在请求进入控制器之前和离开控制器之后执行特定的操作。
与过滤器不同,拦截器是Spring框架提供的特性,并且通常与Spring MVC(Model-View-Controller)一起使用,用于对控制器的请求进行拦截和处理。拦截器主要用于实现以下功能:
-
预处理:在控制器方法执行之前,可以进行一些预处理操作,例如权限验证、数据准备或日志记录等。
-
后处理:在控制器方法执行完成后,可以对响应进行处理,例如添加公共数据、渲染视图或记录响应时间等。
-
异常处理:如果控制器方法抛出异常,拦截器可以捕获并处理这些异常,以进行统一的异常处理逻辑。
拦截器与过滤器的区别在于它们的运行位置和作用对象,拦截器针对的是具体的控制器方法,而过滤器则是针对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("/**");
}
}