一、统一拦截
拦截住所有的请求,看是否合法。是否携带合法的jwt令牌,如果有则放行,执行相应业务代码。
1. filter过滤器
过滤器把对资源的请求拦截下来。
1.1 使用步骤
1.定义Filter:定义一个类,实现Filter接口,并重写其所有方法。
2.配置Filter:Filter类上加@WebFilter注解,配置拦截资源的路径,引导类上加@ServletComponentScan开启Servlet组件支持。
doFilter 方法:
在 doFilter 方法中,开发者可以实现自定义的处理逻辑,比如修改请求头、记录日志等。
doFilter 方法中必须调用 FilterChain 的 doFilter 方法(下面的chain.doFilter),这样请求才能继续传递给下一个过滤器或目标资源(如 Servlet)。如果不调用,请求处理流程将会停止。
1.2 执行流程
注意①②③的顺序。
并且放行后访问对应资源,资源访问完成后,还是会回到Filter,并执行放行后的逻辑。
1.3 拦截路径
写在WebFilter注解中,配置拦截路径。
1.4 过滤器链
在一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链。
顺序优先级:按照过滤器的类名自然排序。
效果如下:
1.5 登录校验流程(重要)
思考:在执行登陆操作时,用户并没有jwt令牌,所以不需要校验令牌。
注意:在Controller中操作,Restcontroller会自动的将返回值转为JSON。
那么在过滤器中如何操作呢?借助一个fastjson工具包!来类型强转。
HttpServletResponse resp = (HttpServletResponse) response;
2. 拦截器(sping框架提供)
2.1 使用步骤
1.定义拦截器,实现HandlerInterceptor接口,并重写所有方法,下图中的①;
2.注册拦截器,下图中的②;
2.2 路径拦截
2.3 流程
在请求处理过程中,拦截器的preHandle方法按注册顺序执行,而postHandle和afterCompletion方法按注册顺序的逆序执行。与Filter相似。
3. 两者区别
1.接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
2.拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只会拦截spring环境中的资源。