JavaWeb—拦截器Interceptor

1.概念

java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后再之前或者之后加入某些操作。

目前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不用深究,知道即可。

  

2.Spring拦截器

spring中拦截器主要分两种,一个是HandlerInterceptor,一个是MethodInterceptor。

2.1 HandlerInterceptor

public interface HandlerInterceptor {
    boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;

    void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception;

    void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception;
}

HandlerInterceptor是springMVC项目中的拦截器,它拦截的目标是请求的地址,比MethodInterceptor先执行。

使用HandlerInterceptor步骤:

  1. 实现一个HandlerInterceptor拦截器可以直接实现HandlerInterceptor接口,也可以继承HandlerInterceptorAdapter类。
  2. 在springMVC配置文件中配置拦截器

代码实例:

public class HandlerInterceptorDemo implements HandlerInterceptor {

    @Override
    public boolean preHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("--------HandlerInterceptor.preHandle---------");
        return true;
    }

    @Override
    public void postHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("--------HandlerInterceptor.postHandle---------");
    }

    @Override
    public void afterCompletion(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("--------HandlerInterceptor.afterCompletion---------");
    }
}
<mvc:interceptors>
        <!-- 在这里配置拦截器将对所有请求都拦截,公共拦截器可以有多个 -->
        <mvc:interceptor>
            <!-- 对/test进行拦截 -->
            <mvc:mapping path="/test"/>
            <!-- 特定请求的拦截器只能有一个 -->
            <bean class="com.xzh.HandlerInterceptorDemo" />
        </mvc:interceptor>
    </mvc:interceptors>

测试结果:

2.2 MethodInterceptor

public interface MethodInterceptor extends Interceptor {
    Object invoke(MethodInvocation var1) throws Throwable;
}

MethodInterceptor是AOP项目中的拦截器,它拦截的目标是方法,即使不是controller中的方法。

使用MethodInterceptor步骤:

  1. 实现MethodInterceptor接口,或利用AspectJ的注解
  2. 在spring配置文件中配置

代码实例:

@Component
public class MethodInterceptorDemo implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        System.out.println("-------MethodInterceptorDemo.invoke--------");
        Method method = methodInvocation.getMethod();
        System.out.println("-------method:"+ method.getName() + "-------");
        return methodInvocation.proceed();//该方法不调用,则被拦截的方法不会被执行
    }
}
<aop:config>
        <!--切入点-->
        <aop:pointcut id="methodPoint" expression="execution(* com.xzh.*Controller.*(..)) "/><!--在该切入点使用自定义拦截器-->
        <aop:advisor pointcut-ref="methodPoint" advice-ref="methodInterceptorDemo"/>
    </aop:config>

测试结果:

 

3.拦截器与过滤器区别 

  1. filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制,这是两者最本质的区别。
  2. 过滤器依赖与servlet容器,而拦截器不依赖与servlet容器。
  3. Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,文件等等,而Interceptor只能过滤请求。
  4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
  5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  6. 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。所以过滤器、拦截器、service()方法,dispatc()方法的执行顺序应该是这样的:

 最后看一下《Spring源码深度解析》对拦截器和过滤器的区别描述:

 

 

 

 

 

 

参考:

Java三大器之拦截器(Interceptor)的实现原理及代码示例

谈谈spring中的拦截器interceptor

spring方法拦截器 MethodInterceptor 配置

拦截器和过滤器的区别

 

转载于:https://www.cnblogs.com/Jason-Xiang/p/7458648.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值