总结贴: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,所以更适合进行业务逻辑判断。比如登录判断、权限判断、日志记录。过滤器更适合全局性的功能过滤、比如敏感词过滤、字符集编码设置。过滤器适用于全局请求的拦截,拦截器可以实现更细粒度的逻辑处理

相关推荐
凌冰_13 小时前
Thymeleaf Maven+Servlet+Mysql图书框架—3(九)
mysql·servlet·maven
就叫飞六吧1 天前
Jenkins 流水线全流程实战笔记
笔记·servlet·jenkins
又是忙碌的一天2 天前
SpringMVC的处理流程
java·mvc
派大鑫wink2 天前
【Day37】MVC 设计模式:原理与手动实现简易 MVC 框架
java·设计模式·mvc
卓怡学长2 天前
m111基于MVC的舞蹈网站的设计与实现
java·前端·数据库·spring boot·spring·mvc
程序员老徐2 天前
SpringBoot嵌入Tomcat注册Servlet、Filter流程
spring boot·servlet·tomcat
cly13 天前
Jenkins重置管理员密码
运维·servlet·jenkins
码界奇点3 天前
基于Spring MVC的缺陷管理系统设计与实现
java·spring·车载系统·毕业设计·mvc·源代码管理
工业甲酰苯胺4 天前
如何一步步将 ASP.NET MVC 升级为.NET
asp.net·mvc·.net
m0_748252384 天前
Servlet 数据库访问
数据库·servlet