首页技术栈归档照片墙音乐日记随想收藏夹友链留言关于

Spring Boot过滤器

写作时间:2026-07-08

Spring Boot过滤器

Web项目中,控制器可以处理具体的业务请求,公共功能的处理则可以利用AOP的思想,通过过滤器或拦截器实现。过滤器和拦截器都属于面向切面编程的具体实现。而两者的主要区别包括以下几个方面:

  • Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。
  • Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理的方式来执行。
  • Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便

Filter

自定义 Filter 有两种实现方式,第一种是使用 @WebFilter,第二种是使用 FilterRegistrationBean,经过实践之后发现使用 @WebFilter 自定义的过滤器优先级顺序不能生效(只能根据Filter类名的字母顺序倒序排列,且优先级都高于FilterRegistrationBean配置的过滤器),因此推荐使用第二个方案。

LoginFilter

package com.webapp.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebFilter("/news/*")//过滤的路径 controller
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {

        //从session中获取用户的信息,判断该用户是否为空,如果没有登录,先登录,否则放行
        //强转为HttpServletRequest
        HttpServletRequest req=(HttpServletRequest)servletRequest;
        //强转为HttpServletResponse
        HttpServletResponse resp=(HttpServletResponse)servletResponse;

        HttpSession session = req.getSession();
        Object loginUser = session.getAttribute("loginUser");
        if (loginUser==null) {
            resp.sendRedirect("/login");
        }
        //放行
        // 继续执行一下一个过滤器
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

主启动类用@ServletComponentScan注解来扫描拦截器注解@WebFilter

@SpringBootApplication
@ServletComponentScan
public class WebApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
}

avatar

yuanyourdomain

写代码,做研究,记录生活。

RECOMMENDED

MyBatis 动态 SQL

2026-07-08

Nginx 基础入门

2026-07-08

Maven 多模块与私服

2026-07-08