[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注解。
相关文章
|
3月前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
3月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
453 1
|
4月前
|
Java 测试技术
Java浮点类型详解:使用与区别
Java中的浮点类型主要包括float和double,它们在内存占用、精度范围和使用场景上有显著差异。float占用4字节,提供约6-7位有效数字;double占用8字节,提供约15-16位有效数字。float适合内存敏感或精度要求不高的场景,而double精度更高,是Java默认的浮点类型,推荐在大多数情况下使用。两者都存在精度限制,不能用于需要精确计算的金融领域。比较浮点数时应使用误差范围或BigDecimal类。科学计算和工程计算通常使用double,而金融计算应使用BigDecimal。
1826 102
|
5月前
|
SQL 前端开发 Java
JavaWeb 学习日记案例详解及 javaweb 完整项目案例实战指南
本文介绍了一个基于Spring Boot的JavaWeb企业员工管理系统完整案例,涵盖部门管理、员工管理、登录、异常处理、事务管理及AOP等核心功能实现,结合CSDN相关技术文章,提供详细技术方案与应用实例,适合JavaWeb开发者学习与参考。
247 0
|
5月前
|
存储 缓存 人工智能
Java int和Integer的区别
本文介绍了Java中int与Integer的区别及==与equals的比较机制。Integer是int的包装类,支持null值。使用==比较时,int直接比较数值,而Integer比较对象地址;在-128至127范围内的Integer值可缓存,超出该范围或使用new创建时则返回不同对象。equals方法则始终比较实际数值。
189 0
|
5月前
|
安全 算法 Java
Java 中 synchronized 与 AtomicInteger 的区别
在Java多线程编程中,`synchronized`和`AtomicInteger`均用于实现线程安全,但原理与适用场景不同。`synchronized`是基于对象锁的同步机制,适用于复杂逻辑和多变量同步,如银行转账;而`AtomicInteger`采用CAS算法,适合单一变量的原子操作,例如计数器更新。二者各有优劣,应根据具体需求选择使用。
173 0
|
6月前
|
算法 Java 数据库连接
Java 与 C++ 区别深入剖析及应用实例详解
本文深入剖析了Java和C++两种编程语言的区别,从编译与执行机制、面向对象特性、数据类型与变量、内存管理、异常处理等方面进行对比,并结合游戏开发、企业级应用开发、操作系统与嵌入式开发等实际场景分析其特点。Java以跨平台性强、自动内存管理著称,适合企业级应用;C++则因高性能和对硬件的直接访问能力,在游戏引擎和嵌入式系统中占据优势。开发者可根据项目需求选择合适语言,提升开发效率与软件质量。附面试资料链接:[点此获取](https://pan.quark.cn/s/4459235fee85)。
589 0
|
6月前
|
存储 Java C语言
Java List 复制:浅拷贝与深拷贝方法及区别
我是小假 期待与你的下一次相遇 ~
642 1
|
7月前
|
Java
Java 中 Exception 和 Error 的区别
在 Java 中,`Exception` 和 `Error` 都是 `Throwable` 的子类,用于表示程序运行时的异常情况。`Exception` 表示可被捕获和处理的异常,分为受检异常(Checked)和非受检异常(Unchecked),通常用于程序级别的错误处理。而 `Error` 表示严重的系统级问题,如内存不足或 JVM 错误,一般不建议捕获和处理。编写程序时应重点关注 `Exception` 的处理,确保程序稳定性。
235 0
|
Java 缓存 应用服务中间件
Java EE 之 过滤器入门学习与总结(2)
今天就对使用Filter技术能做什么来个小小的归纳。也为了方便今后的复习。 控制浏览器不进行对jsp页面的缓存 //在doFilter方法中添加这样的代码 HttpServletRequest request = (HttpServletRequest )req; Ht...
1108 0