🌈键盘敲烂,年薪30万🌈
目录
一、过滤器filter
概念介绍:
过滤器的使用:
过滤器的执行流程:
应用场景(登录校验):
二、拦截器Interceptor
概念介绍:
拦截器的使用:
执行流程:
三、拦截器与过滤器区别:
📕总结
一、过滤器filter
概念介绍:
过滤器是JavaWeb的三大核心组件之一,它是用来拦截请求的,拦截到请求之后执行相应的逻辑决定是否放行该请求,从而实现一些特殊功能。
注意:
过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。
过滤器的使用:
- ①定义一个类,实现Filter接口,重写其所有的方法
- ②在该类上加 @WebFilter(urlPatterns="/xxx") 注解,指定拦截的请求路径。
- ③在启动类加@ServletComponentScan ,由于filter隶属Web服务器,所以要在spring开启Servlet组件支持。
🍋3种拦截路径:
Filter接口的方法
default void init :初始化方法,Web服务器启动,创建Filter时调用,只调用一次
void doFilter : 拦截到请求时,调用该方法,可调用多次
default void destroy : 销毁方法,服务器关闭时调用,只调用一次
过滤器的执行流程:
注意:
放行后访问对应的Web资源,资源访问后,会回到过滤器执行放行后逻辑!!!
应用场景(登录校验):
分析:例如学生管理系统,客户端在发送查询请求时,服务器要先判断该请求是否为登录请求,若是,放行执行登录操作,若不是,判断是否是已登录用户,只有登录的才相应你的查询请求。
@WebFilter("/*") //拦截所有请求
public class CheckLogin implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse res = (HttpServletResponse) servletResponse;
//检查是否为登录请求
StringBuffer sburl = req.getRequestURL();
String url = sburl.toString();
if(url.contains("login")){
log.info("登录请求 放行");
filterChain.doFilter(servletRequest, servletResponse);
return;
}
//不是登录请求,判断是否是已登录用户
//获取jwt令牌
String jwt = req.getHeader("token");
log.info("jwt令牌{}", jwt);
//jwt为null 或 ""
//返回未登录信息 json格式
if(!Strings.hasLength(jwt)){
log.info("jwt令牌为null 或 \"\" ");
//返回错误信息
Result error = Result.error("NOT_LOGIN");
//获取json格式的字符串
String jsonString = JSONObject.toJSONString(error);
//获取输出流
res.getWriter().write(jsonString);
return;
}
//校验jwt令牌
try {
JwtUtils.parseJWT(jwt);
} catch (Exception e) {
e.printStackTrace();
//解析出错 返回错误信息
Result error = Result.error("NOT_LOGIN");
//获取json格式的字符串
String jsonString = JSONObject.toJSONString(error);
//获取输出流
res.getWriter().write(jsonString);
return;
}
//放行
log.info("放行");
filterChain.doFilter(servletRequest, servletResponse);
}
}
二、拦截器Interceptor
概念介绍:
类似于过滤器。Spring框架中提供的,用来动态拦截controller层方法的执行。
拦截器的使用:
- ①定义拦截器:定义一个实现HandlerInterceptor接口的实现类,并重写其所有方法。
- ②注册拦截器:定义WebMvcConfigurer接口的实现类,重写注册拦截器的方法addInterceptors来指定拦截路径。
🍋拦截路径
注意:
注册拦截器相当于配置文件,要加@Configuration注解,并且要利用依赖注入获取定义的拦截器对象
拦截器是控制Controller层的请求,所以要加@Compoent注解
执行流程:
代码演示:
//注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
LoginCheckInterceptor loginCheckInterceptor;
@Override //注册一个拦截器
public void addInterceptors(InterceptorRegistry registry) {
//添加一个拦截器并拦截除登录外的所有请求
registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
}
}
//定义拦截器
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override //拦截前运行,返回true放行,false不放行
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
log.info("拦截到请求,执行相应逻辑xxx");
}
@Override //放行后执行该方法
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("请求被放行了");
}
@Override //响应前执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("请求响应之前的方法");
}
三、拦截器与过滤器区别:
通常情况下,过滤器更适用于URL级别的过滤和处理,而拦截器更适用于方法或请求级别的拦截和处理。
-
调用顺序:先调用过滤器,在调用拦截器,因为过滤器属于Web容器,拦截器属于spring框架。
-
作用范围:过滤器拦截所有Url请求,拦截器只拦截spring框架中controller层的方法
-
功能:过滤器主要用于对请求进行预处理和后处理,如请求编码转换、参数过滤、请求日志记录等。拦截器主要用于对请求进行拦截和拦截后的处理,如权限验证、登录验证、日志记录等。
-
调用方式:过滤器通过在web.xml文件中配置进行调用,对请求进行预处理和后处理。拦截器则是通过框架提供的注解或配置方式进行调用。
📕总结
- 过滤器隶属Web容器,定义一个过滤器需实现Filter接口,并加入@WebFilter(urlPatterns="/x")注解指定拦截路径。
- 拦截器隶属Spring框架,定义一个拦截器需要实现HandlerInterceptor接口,并定义一个注册拦截器的类加入@Configuration注解。