[JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别

简介: [JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别

🌈键盘敲烂,年薪30万🌈


一、过滤器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级别的过滤和处理,而拦截器更适用于方法或请求级别的拦截和处理。

  1. 调用顺序:先调用过滤器,在调用拦截器,因为过滤器属于Web容器,拦截器属于spring框架。
  2. 作用范围:过滤器拦截所有Url请求,拦截器只拦截spring框架中controller层的方法
  3. 功能:过滤器主要用于对请求进行预处理和后处理,如请求编码转换、参数过滤、请求日志记录等。拦截器主要用于对请求进行拦截和拦截后的处理,如权限验证、登录验证、日志记录等。
  4. 调用方式:过滤器通过在web.xml文件中配置进行调用,对请求进行预处理和后处理。拦截器则是通过框架提供的注解或配置方式进行调用。

📕总结

  • 过滤器隶属Web容器,定义一个过滤器需实现Filter接口,并加入@WebFilter(urlPatterns="/x")注解指定拦截路径。
  • 拦截器隶属Spring框架,定义一个拦截器需要实现HandlerInterceptor接口,并定义一个注册拦截器的类加入@Configuration注解。
相关文章
|
20天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
53 14
|
16天前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
19 1
|
26天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
44 8
|
1月前
|
监控 Java 数据管理
java会话跟踪和拦截器过滤器
本文介绍了Web开发中的会话跟踪技术——Cookie与Session,以及过滤器(Filter)和监听器(Listener)的概念和应用。Cookie通过在客户端记录信息来识别用户,而Session则在服务器端保存用户状态。过滤器用于拦截和处理请求及响应,监听器则监控域对象的状态变化。文章详细解释了这些技术的实现方式、应用场景和主要方法,帮助开发者更好地理解和使用这些工具。
45 1
|
1月前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
2月前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
2月前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
35 1
|
2月前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
2月前
|
缓存 算法 Java
Java 中线程和纤程Fiber的区别是什么?
【10月更文挑战第14天】
93 0
|
XML Java 数据格式
java WebService CXF Spring 自定义拦截器 附实例源码
java WebService CXF Spring 自定义拦截器 附实例源码
190 0
java WebService CXF Spring 自定义拦截器 附实例源码