总结贴:Servlet过滤器、MVC拦截器

一:Servlet过滤器

1.1解析

Filter 即为过滤,用于请求到达Servlet之前(Request),以及再Servlet方法执行完之后返回客户端进行后处理(HttpServletResponse)。简单说就是对请求进行预处理,对响应进行后处理

在请求到达Servlet之前,可以经过多个Filter,即Filter 链。再相应客户端也会相应经过多个Filter。

过滤器当请求访问资源时,过滤器执行的顺序是1->2->3,到达资源中后,响应的顺序是3->2->1。

方法解析:

init()方法:初始化的时候执行。

doFilter()方法:执行过滤。

destroy()方法:调用doFilter()方法之后,执行销毁资源的。

1.2步骤

a:定义一个类,类上标注注解@WebFilter,并实现接口Filter

b:复写方法init()、doFilter()、destroy()----主要就复写doFilter()就行

java 复制代码
@WebFilter(urlPatterns="/*")//访问所有资源之前,都会执行该过滤器。/*表示拦截所有路径,也可以拦截指定某路径
@Order(1)//过滤器执行顺序,越小越先执行。
public class MyFilter implements Filter {

    //Demo:统计访问ip的Controller次数
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filterDemo01被执行了...");

        //获取请求
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        //预处理逻辑:
        //访问的ip
        String ip = request.getRemoteAddr();
        HttpSession session = request.getSession();
        Integer count = (Integer) session.getAttribute("count");
        count = Objects.isNull(count) ? 1 : ++count;
        session.setAttribute("count",count);

        System.out.println("count:"+count);
        //放行
        filterChain.doFilter(servletRequest,servletResponse);

    }

下面是第二个拦截器

java 复制代码
@WebFilter(urlPatterns="/*")
@Order(2)
public class MyFilter2 implements Filter {

    //Demo:统计访问ip的Controller次数
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filterDemo02被执行了...");

        //获取请求
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        //预处理逻辑:
        //访问的ip
        String ip = request.getRemoteAddr();
        HttpSession session = request.getSession();
        Integer count = (Integer) session.getAttribute("count");
        count = Objects.isNull(count) ? 1 : ++count;
        session.setAttribute("count",count);

        System.out.println("count:"+count);
        //放行
        filterChain.doFilter(servletRequest,servletResponse);

    }


}
复制代码
控制台执行效果是这样的,这就是过滤器链
filterDemo01被执行了...
count:1
filterDemo02被执行了...
count:2

二:MVC拦截器

2.1解析

作用和filter类似

2.2步骤

a.自定义拦截器MyInterceptor,实现WebMvcConfigurer,重写方法preHandle(这个类似于过滤器的doFilter)

java 复制代码
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println("拦截器执行了");

        String ip = request.getRemoteAddr();
        HttpSession session = request.getSession();
        Integer count = (Integer) session.getAttribute("count");
        count = Objects.isNull(count) ? 1 : ++count;
        session.setAttribute("count",count);

        System.out.println("ip:"+ip+";"+"count:"+count);

        //进行放行,return true即放行;,return false就是不放行
        return true;
    }
}

b.拦截器配置类,(相当于把自定义的拦截器放入到ioc对象中)

java 复制代码
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    //把自定义的拦截器放入到ioc对象中
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        MyInterceptor myInterceptor = new MyInterceptor();//刚刚自定义的拦截器
        registry.addInterceptor(myInterceptor).addPathPatterns("/**");//把拦截器放入到ioc对象中,并且设置起效范围
    }
}

三:过滤器和拦截器区别?

a、 拦截器(Interceptor) 它是一个SpringMVC提供的一个逻辑处理的组件,他是依赖于Spring的。过滤器依赖于servlet容器,所以它只能在web程序中使用。

b、拦截器只是对处理器(Controller中的方法)进行拦截,但是不能对JS,JSP等静态资源拦截。而过滤器则可以所有请求。

b、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

d、如果项目中过滤器和拦截器同时存在,他们的执行顺序是:Filter、Servlet、Intercepter,再到达controller层

e、因为拦截器更靠近cotroller,并且可以很方便获取容器的中的各个Bean,所以更适合进行业务逻辑判断。比如登录判断、权限判断、日志记录。过滤器更适合全局性的功能过滤、比如敏感词过滤、字符集编码设置。过滤器适用于全局请求的拦截,拦截器可以实现更细粒度的逻辑处理

相关推荐
带刺的坐椅6 小时前
无耳科技 Solon v3.0.7 发布(2025农历新年版)
java·spring·mvc·solon·aop
鱼骨不是鱼翅12 小时前
Spring Web MVC基础第一篇
前端·spring·mvc
hong_zc14 小时前
Spring MVC (三) —— 实战演练
java·spring·mvc
未来并未来2 天前
通过反射搭建简易的Servlet层自动化映射参数并调用Service层业务方法的框架
运维·servlet·自动化
UVCuttt2 天前
三天急速通关JavaWeb基础知识:Day 1 后端基础知识
java·servlet·java-ee·tomcat
weixin_422778892 天前
spring mvc 创建restapi 笔记
笔记·spring·mvc
简 洁 冬冬3 天前
Java中的Servlet
java·开发语言·servlet
阳光阿盖尔4 天前
【javaweb项目idea版】蛋糕商城(可复用成其他商城项目)
java·servlet·intellij-idea·javaweb·商城·蛋糕商城·购物商城
我要学编程(ಥ_ಥ)4 天前
初始JavaEE篇 —— Spring Web MVC入门(上)
spring boot·spring·java-ee·mvc
码农小灰5 天前
Spring MVC中HandlerInterceptor的作用及应用场景
java·spring boot·后端·spring·mvc