过滤器和拦截器区别以及执行顺序图_压缩空气过滤器安装顺序

2022-09-23 11:25:49 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

过滤器和拦截器区别

觉得这个总结的很好,所以用来借鉴借鉴 摘抄于网络,侵删

过滤器和拦截器执行顺序 在SpringBoot中编写测试代码

  • 自定义过滤器
代码语言:javascript复制
/** * @Author: xiaoshijiu * @Date: 2019/5/22 * @Description: 自定义过滤器 */
public class MyFilter extends HttpFilter { 
     
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException { 
     
        System.out.println("Filter----before");  
        chain.doFilter(request,response);
        System.out.println("Filter----after");
    }
}

自定义拦截器 (有关SpringMVC的拦截器知识原理,可以参照我之前的博客) SpringMVC拦截器详解 SpringMVC拦截器执行顺序原理解释

代码语言:javascript复制
/** * @Author: xiaoshijiu * @Date: 2019/5/22 * @Description: $value$ */
public class MyInterception implements HandlerInterceptor { 
       
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler) throws Exception { 
       
        System.out.println("Interception----before");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception { 
       
        System.out.println("Interception----before2");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
            Object handler, Exception ex) throws Exception { 
       
        System.out.println("Interception----after");
    }
}
  • 配置拦截器和过滤器
代码语言:javascript复制
/** * @Author xiaoshijiu * @Description 自定义Mvc配置,实现全面接管SpringMvc的配置 * @Date 2019/5/13 */
@Configuration
public class MyWebMvc implements WebMvcConfigurer { 
       
    /** * 注册自定义的filter 就相当于在普通web工程中,在web.xml中注册的<filter></filter> */
    @Bean
    public FilterRegistrationBean myFilter() { 
       
        return new FilterRegistrationBean(new MyFilter());
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) { 
       
        // 添加自定义的拦截器
        registry.addInterceptor(new MyInterception()).addPathPatterns("/hello");
    }
}
  • 编写Controller,测试
代码语言:javascript复制
/** * @Author: xiaoshijiu * @Date: 2019/5/22 * @Description: 测试Controller */
@RestController
public class Mycontroller { 
       

    @RequestMapping("hello")
    public String hello() { 
       
        System.out.println("hello...来了");
        return "hello";
    }
}
  • 打印结果

这里可以看到拦截器和过滤器的执行顺序,对照着上面他们的区别也是很好理解的 总结一下,执行顺序

这里还有一个问题就是发送/hello请求filter被执行了两次,我们可以获取url来判别一下 自定义过滤器添加代码

代码语言:javascript复制
		HttpServletRequest servletRequest = (HttpServletRequest) request;
        System.out.println(servletRequest.getRequestURI());

可以看到SpringBoot项目会发送图标的请求(/favicon.ico)

最后在补充一下,request获取请求的一些方法的内容

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172388.html原文链接:https://javaforall.cn

0 人点赞