前面一篇后端登录校验(一)—— 会话技术讲了登录验证中的三个会话技术,其中JWT令牌是web开发当中的主流技术,客户端获取到服务器下发的令牌,之后每一次请求都会在请求头中携带令牌给服务器,而服务端需要统一拦截所有的请求,从而判断是否携带的有合法的JWT令牌。
服务器统一拦截到所有的请求,并校验令牌的有效性,有两种方案来实现这个操作:
1.Filter过滤器 2.Interceptor过滤器
以下介绍这两种方案。
一、Filter过滤器
1.什么是Filter?
Filter表示过滤器,是 JavaWeb三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。使用了过滤器之后,要想访问web服务器上的资源,必须先经过滤器,过滤器处理完毕之后,才可以访问对应的资源。
过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。
2.如何使用Filter——基于SpringBoot
第一步是定义过滤器 :定义一个类,实现 jakarta.servlets.Filter 接口,并重写其所有方法。
第二步是配置过滤器:过滤器类上加 @WebFilter 注解,配置拦截资源的路径。引导类上加 @ServletComponentScan 开启Servlet组件支持。
过滤器有三个方法:init、doFilter还有destory方法
init方法在服务器开启时执行一次,执行初始化操作。doFilter方法执行拦截操作。destory方法在服务器关闭时执行一次,主要负责资源回收和环境清理。
3.基于Fileter实现登录校验功能
基本流程是:
首先浏览器访问服务器端的登录接口,比如是“、login”。然后服务器端进行登录操作,在登录成功后,服务器端生成JWT令牌,并返回给浏览器也就是前端,前端会存储令牌,在后续的灭一次请求中,前端都会将JWT令牌交给服务器,在访问对应的业务功能前,需要校验令牌的有效性,如果令牌无效,则响应一个错误的信息,如果令牌存在并且有效,服务器将放行去访问对应的资源。
注意:除了登录请求之外的所有请求都要校验令牌,因为没有登录就没有令牌。
具体的操作步骤是:
首先从请求中获取请求路径,通过请求路径判断此次请求是否是登录请求,如果是登录请求则放行,如果不是则校验JWT令牌的有效性,从请求头中获取JWT令牌,判断令牌是否为空,为空则响应错误信息, 不为空则解析令牌进行校验,成功则放行。放行需要调用FilterChain对象中的doFilter()方法。
二、Interceptor拦截器
1.什么是Interceptor拦截器
拦截器是一种动态拦截方法调用的机制,类似于过滤器,是由Spring框架提供的,作用就是拦截请求。
2.拦截器的使用方法
第一步是自定义拦截器,假设是DemoInterceptor,实现HandlerInterceptor接口,并重写所有的方法。并加上@Component注解。接口中的方法有:preHandle方法,这个方法在目标资源方法执行前执行,返回true代表放行,返回false代表不放行;postHandle方法,这个方法在目标资源方法执行后执行;afterCompletion方法,这个方法在视图渲染完毕后执行,并且是最后执行。
第二步是注册配置拦截器, 创建一个配置类WebConfig,实现WebMvcConfigurer接口,重写addInterceptors方法,示例代码如下:
@Configuration
public class WebConfig implements WebMvcConfigurer {
//自定义的拦截器对象
@Autowired
private DemoInterceptor demoInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry){
//注册自定义拦截器对象
registry.addInterceptor(demoInterceptor).addPathPatterns("/**");
}
}
三、注意事项
过滤器实现Filter接口,拦截器实现HandlerInterceptor接口;过滤器会拦截所有的资源,拦截器只会拦截Spring中的环境。