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

相关推荐
ccddsdsdfsdf4 小时前
DBeaver怎么链接mongoDB
数据库·mongodb
丷丩5 小时前
Postgresql基础实践教程(十一)各种Join
数据库·postgresql·join
星夜夏空995 小时前
FreeRTOS学习(4)——内存映射
数据库·学习·mongodb
TheRouter6 小时前
AI Agent 记忆体系建设实战:短期、长期与工作记忆的工程实现
数据库·人工智能·oracle
Omics Pro6 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
JAVA面经实录9177 小时前
Hibernate面试题库
数据库·oracle·hibernate
迷枫7127 小时前
DM8 目录结构与常用排查入口梳理
服务器·数据库
Mr.Daozhi9 小时前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具
小程故事多_809 小时前
Claude Code自定义workflow skills用法
数据库·人工智能·智能体
大鹏说大话9 小时前
SQL 排序与分组实战:解决“分组后取最新数据“
android·java·数据库