Servlet(Filter),Interceptor

servlet 本质是 java 官方提供的一个接口,用于接收浏览器 http/https 请求,处理请求,并返回处理结果

Spring(是一个轻量级java开发框架,核心是Aop和Ioc),SpringMvc(Spring框架提供的基于Mvc设计规范的,用来简化web开发,处理Http请求的Web框架) 底层都是用的 Servlet

我们现在写的 @GetMapping @PostMapping @RestController

底层全部都是 Servlet 在工作!

  • SpringMVC = 封装了 Servlet
  • SpringBoot = 自动配置了 Servlet

Filter(过滤器)

是基于 servlet 的技术,本质上是一个接口,可以过滤所有请求

作用时机是在进入servlet 之前

interceotor(拦截器)

基于SpringMvc 框架,本质也是一个接口,只作用于Controller接口

作用时机是,进入Controller接口前后,(方法执行前和执行后)

过滤器的具体实现(本质上就是实现Filter接口,然后重写doFilter方法,使用@WebFilter()注解来定义过滤路径)

java 复制代码
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

// 过滤所有请求 /*
@WebFilter("/*")
public class LoginFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, 
                         ServletResponse response, 
                         FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        // ----------------------
        // 【请求进入前】执行
        // ----------------------
        System.out.println("过滤器:请求进来了 → " + req.getRequestURI());

        // 例子:登录校验
        if (req.getSession().getAttribute("user") == null) {
            resp.getWriter().write("请先登录!");
            return; // 不放行
        }

        // 放行!请求继续走到后面的拦截器 + Controller
        chain.doFilter(request, response);

        // ----------------------
        // 【响应返回前】执行
        // ----------------------
        System.out.println("过滤器:请求返回了");
    }
}

再启动过滤器全局扫描

java 复制代码
@SpringBootApplication
@ServletComponentScan // 必须加!
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

拦截器的代码实现

实现拦截器功能也只需要两步,第一创建拦截器(实现HandlerInterceptor接口,重新处理方法),第二配置拦截器

java 复制代码
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {

    // ----------------------
    // 【进入 Controller 之前】执行
    // ----------------------
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {

        System.out.println("拦截器:进入Controller前");

        // 检查登录
        if (request.getSession().getAttribute("user") == null) {
            response.getWriter().write("拦截器:请登录");
            return false; // 不放行
        }

        return true; // 放行
    }

    // ----------------------
    // 【Controller 执行完之后】执行
    // ----------------------
    @Override
    public void postHandle(...) {
        System.out.println("拦截器:Controller执行完了");
    }

    // ----------------------
    // 【全部结束后】执行
    // ----------------------
    @Override
    public void afterCompletion(...) {
        System.out.println("拦截器:请求完全结束");
    }
}

配置拦截器(实现WebMcvConfigurer接口,重写addInterceptors方法)

java 复制代码
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")        // 拦截所有接口
                .excludePathPatterns("/login");// 排除登录接口
    }
}

最后再给一个请求处理路径

请求-->Filter-->servlet-->Interceptor-->controller

相关推荐
程序员阿鹏6 分钟前
为什么MySQL InnoDB选择B+树?
数据结构·数据库·b树·sql·mysql·算法·缓存
瀚高PG实验室1 小时前
使用pg_stat_statements抓取数据库TOP SQL
数据库·sql·postgresql·瀚高数据库
yanwumuxi3 小时前
【数据库系列】opensearch数据备份和恢复
数据库
anxiao_m3 小时前
2026企业AI数字孪生选型攻略,不同场景对应不同解决方案
大数据·网络·数据库
SelectDB3 小时前
从 ClickHouse 迁移到 Doris:SQL 兼容、同步与验证清单(实战笔记)
大数据·数据库·数据分析
SelectDB3 小时前
Doris 还是 ClickHouse?一张表说清 6 个关键差异(实战笔记)
大数据·数据库·数据分析
oradh4 小时前
Oracle Undo问题总结(两类Undo表空间不足和单个会话占用大量Undo的性能问题)
数据库·oracle
企业数字化笔记4 小时前
固定资产财务账与实物账怎么对账?折旧快照、差异检测与SQL核对
android·数据库·sql
DBA_G4 小时前
GBase 8a表空间多路径存储数据迁移链路适配解析
数据库·oracle
java1234_小锋4 小时前
Tornado 6.5,全面支持 Python 3.14
数据库·python·tornado