拦截器、过滤器、监听器

6 篇文章 0 订阅

拦截器与过滤器的区别 : 
    1. 拦截器是基于java的反射机制的。而过滤器是基于函数回调,Spring框架支持,可Spring中的数据源、事务管理等。
    2. 使用范围不同:拦截器不依赖与servlet容器,过滤器依赖与servlet容器。 
    3. 拦截器只能对action请求起作用,针对类,拦截器可以多次被调用。

             而过滤器则可以对几乎所有的请求起作用,在容器启动是初始化调用init方法,以后每个请求都调用doFilter()。作用范围包含拦截器。
    4. 拦截器可以访问action上下文、值栈里的对象(即方法中的对象),而过滤器不能访问。 
    5. 拦截器可以在方法前后,异常前请求后各调用一次后等调用,

            而过滤器只能在请求前和。

    6.深度不同:Filter在Servlet前后作用,Interceptor在方法的前后作用,异常抛出前后,具有更大的弹性。所以优先使用拦截器。

    7.filter配置在web.xml中    interceptor配置在spring配置文件中 

拦截器是AOP的一种实现策略,可实现依赖注入。

 

因此它的完整加载顺序就是 :ServletContext -> context-param -> listener-> filter -> servlet

 

开发一个监听器,实现  ServletContextListener 接口

不过有一点需要注意的是: spring容器的加载要在servlet之后,因此在有些过滤器当中需要提前用到spring bean的时候,就需要改成 Listener 的方式

org.springframework.web.context.ContextLoaderListener

ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。

容器监听器ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。

要求每次访问action都无需加载新的xml文件,利用框架的监听器实现只在服务器启动时加载一次xml配置,用于提高性能。

监听器内如何引用对象:

1、直接加载“bean.xml”文件,bean被实例化了两次,不可取。

2、从servletcontext中获取。解析:(前一步在contextLoaderListener,后两步在contextLoader中)

 

1

2

3

4

5

6

7

8

9

10

11

/**

     * Initialize the root web application context.

     */

    public void contextInitialized(ServletContextEvent event) {

        this.contextLoader = createContextLoader();

//获取spring配置文件,创建webapplicationcontext

    this.contextLoader.initWebApplicationContext(event.getServletContext());

    }

    protected ContextLoader createContextLoader() {

        return new ContextLoader();

    }

<wiz_tmp_tag class="wiz-block-scroll">

 

 

1

2

3

4

this.context = createWebApplicationContext(servletContext, parent);

            servletContext.setAttribute(

//创建好的spring context交给application内置对象,使监听器,过滤器,拦截器都可以访问。

    WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);

 

1

2

3

4

5

6

7

8

9

//获取spring配置文件路径

String configLocation = servletContext.getInitParameter(CONFIG_LOCATION_PARAM);

        if (configLocation != null) {

    wac.setConfigLocations(StringUtils.tokenizeToStringArray(configLocation,                ConfigurableWebApplicationContext.CONFIG_LOCATION_DELIMITERS));

        }

//加载spring文件

        customizeContext(servletContext, wac);

        wac.refresh();

        return wac;

1

2

3

4

5

6

// 解决方案二,项目在启动时,把Spring配置文件通过Spring的监听器加载,存储到ServletContext中,我们只要在ServletContext中获取即可。 

//方法传入对象ServletContextEvent event

   ApplicationContext context = (ApplicationContext) event.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

//工具类WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());

   productService = (ProductService) context.getBean("productService"); 

   System.out.println(productService);

 

 

 开发一个过滤器必须实现java定义好的javax.servlet.Filter接口:      (Servlet的特性)

       这一接口含有三个过滤器必须执行的方法:

doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。这同样是上游过滤器调用的方法。

        引入的FilterChain对象提供了后续过滤器所要调用的信息。如果该过滤器是过滤器链中的最后一个过滤器,则将请求交给被请求资源。也可以直接给客户端返回响应信息。

init(FilterConfig):由Web容器来调用完成过滤器的初始化工作。它保证了在第一次doFilter()调用前由容器调用。您能获取在 web.xml 文件中指定的初始化参数。

destroy():由Web容器来调用来释放资源,doFilter()中的所有活动都被该实例终止后,调用该方法。

 

开发一个拦截器必须实现HandlerInterceptor接口:

preHandle():这个方法在handler执行之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对 请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。

postHandle():这个方法在handler执行后,但是DispatcherServlet 向客户端返回响应前被调用,在该方法中对用户请求request进行处理。

afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。view渲染完成、dispatcherServlet返回之前执行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
拦截过滤器监听器是在软件开发中常用的三种组件,用于对请求进行干预、选择和获取事件细节。它们的区别如下[^1][^2]: 1. 拦截(Interceptor): 拦截用于在请求进行中干预其进展,并可以控制是否终止请求的执行。拦截可以在请求前、请求后或请求完成后执行特定的操作,例如记录日志、权限验证等。 2. 过滤器(Filter): 过滤器用于从一堆东西中选择符合特定要求的内容。它可以定义一些规则或条件,根据这些规则或条件来过滤出符合要求的内容。过滤器通常用于对请求进行预处理或后处理,例如请求参数的校验、字符编码的转换等。 3. 监听器(Listener): 监听器用于获取事件发生的细节,而不对事件的执行过程进行干预。当特定事件发生时,监听器可以捕获该事件并执行相应的操作。监听器通常用于记录日志、统计数据等。 示例代码如下: ```java // 拦截示例 public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求前执行的操作 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在请求后执行的操作 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在请求完成后执行的操作 } } // 过滤器示例 public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 过滤器初始化操作 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 过滤器处理请求的操作 chain.doFilter(request, response); } @Override public void destroy() { // 过滤器销毁操作 } } // 监听器示例 public class MyListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { // 监听器初始化操作 } @Override public void contextDestroyed(ServletContextEvent sce) { // 监听器销毁操作 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值