栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring和springboot中对应监听器、过滤器、拦截器的使用区别

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring和springboot中对应监听器、过滤器、拦截器的使用区别

     

目录

Spring中

过滤器

 监听器

拦截器 

 springboot中

过滤器

监听器

拦截器


搞明白监听器、过滤器、拦截器的作用和使用方式,首先需要了解spring对于这三个的加载时机是在怎么样的,如下图:

 

   spring对于这三者依次是先执行过滤器(多个过滤器采用责任链模式依次调用执行),紧接着是监听器,最后才是拦截器。

     而这三者的作用:             

        过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。(不更改对象的行为和属性) 

        监听器(Listener):当一个事件发生的时候,你希望获得这个事件发生的详细信息,而并不想干预这个事件本身的进程,这就要用到监听器。 (不更改对象的行为和属性)

        拦截器(Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。(更改对象的行为和属性)

能力逐渐增强:过滤器-->监听器-->拦截器

Spring中

过滤器

   需要在项目的web.xml中配置过滤器和过滤请求:如下图

public class CrosFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("启动时初始化???");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("新的请求每次都会执行请求时机????");
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        //允许跨域的域
        response.setHeader("Access-Control-Allow-Origin", "*");
        //允许携带脚本程序
        response.setHeader("Access-Control-Allow-Credentials","true");
        //允许的跨域请求
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE,PUT,PATCH");
        //允许脚本访问返回的头
        response.setHeader("Access-Control-Expose-Headers", "true");
        //缓存此请求秒数
        response.setHeader("Access-Control-Max-Age", "3600");
        //自定义的头部
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, content-type");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("服务器停止时销毁??");
    }
}

 监听器

    监听器的使用跟过滤器类似,也需要在web.xml中配置你的监听类

  • 监听ServletContext的事件监听器,分别为:ServletContextListener、ServletContextAttributeListener。Application级别,整个应用只存在一个,可以进行全局配置。
  • 监听HttpSeesion的事件监听器,分别为:HttpSessionListener、HttpSessionAttributeListener。Session级别,针对每一个对象,如统计会话总数。
  • 监听ServletRequest的事件监听器,分别为:ServletRequestListener、ServletRequestAttributeListener。Request级别,针对每一个客户请求。

拦截器 

拦截器的配置下MV的配置文件中

@Component
public class UserInterceptor implements HandlerInterceptor {

    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("新的请求:"+handler);
        return true;
    }

    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("请求处理后视图前:"+handler+"==="+modelAndView);
    }

    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        System.out.println("请求完全执行完成:"+handler+"--"+ex);
    }
}

 springboot中 过滤器

过滤器不需要额外的配置,直接交由spring管理即可,或者使用@WebFilter,二者选其一,使用@WebFilter,需要在启动类上开启对servlet注解的支持

在SpringBootApplication上使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码

@Component
//@WebFilter(urlPatterns = "/api
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("新的请求:"+handler);
        return true;
    }

    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("请求处理后视图前:"+handler+"==="+modelAndView);
    }

    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        System.out.println("请求完全执行完成:"+handler+"--"+ex);
    }
}

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    
    @Bean
    public HandlerInterceptor getMyInterceptor(){
        return new UserInterceptor();
    }


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration interceptor = registry.addInterceptor(getMyInterceptor());
        // 拦截所有、排除
        interceptor.addPathPatterns("/**")
                .excludePathPatterns("/user/login");
    }
}

运行结果:


        

总结至此

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/273568.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号