9.SpringMVC-拦截器

SpringMVC拦截器

采用AOP思想和过滤器类似,用于拦截控制器处理方法之前和之后,用于完成一些和主业务没有太多关系的附加功能。

比如:权限控制 日志 异常 方法执行时间统计。 自定义拦截器 需要实现 HandlerInteceptor接口。

该接口的三个方法:

boolean preHandler(HttpServletRequest,HttpServletResponse,Object handler)

在处理器(Controller)方法执行之前 执行,handler代表 被拦截的这个方法的信息 返回true 拦截器放行,返回false 后续一切操作都被停止,需要利用 request或者是 response做出响应

void postHandler(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView mv)

在处理器 方法执行完之后,视图渲染之前 执行, modelandView 代表 处理器方法返回的 模型和视图,可以修改和查看。

void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception e)

在视图渲染完毕之后执行,一旦之前的过程中出现异常,会直接执行 afterCompletion. e代表 之前过程中抛出的异常,可以在这个环节 做异常日志

拦截器注册:

<bean class="com.edu.interceptor.MyInterceptor"></bean>
<<mvc:interceptors>
    <mvc:interceptor>
        <!-- /** 表示拦截所有            -->
        <mvc:mapping path="/**"/>
        <!-- 不拦截哪些请求           -->
        <mvc:exclude-mapping path="/"/>
        <!-- 拦截器的类型           -->
        <bean class="com.edu.interceptor.MyInterceptor2"></bean>
    </mvc:interceptor>
</mvc:interceptors>

工作流程:

可以看到先执行拦截器的preHandle方法----》执行目标方法----》执行 拦截器的postHandle方法----》执行页面跳转----》执行拦截器的afterCompletion 方法

在配置拦截器的时候有两个需要注意的点:

1、如果prehandle方法返回值?为false,那么意味着不放行,那么就会 造成后续的所有操作都中断

2、如果执行到方法中出现异常,那么后续流程不会处理但是 afterCompletion方法会执行

拦截器跟过滤器的区别?

1、过滤器是基于函数回调的,而拦截器是基于java反射的

2、过滤器依赖于servlet容器,而拦截器不依赖与Servlet容器,拦截器依赖SpringMVC

3、过滤器几乎对所有的请求都可以起作用,而拦截器只能对 SpringMVC请求起作用

4、拦截器可以访问处理方法的上下文,而过滤器不可以

阅读剩余
THE END