`

SpringMVC深入总结--Spring中的拦截器

阅读更多
Spring为我们提供了:
org.springframework.web.servlet.HandlerInterceptor接口,

org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器,
实现这个接口或继承此类,可以非常方便的实现自己的拦截器。

有以下三个方法:

Action之前执行:

1 public boolean preHandle(HttpServletRequest request,   HttpServletResponse response, Object handler);
生成视图之前执行

1 public void postHandle(HttpServletRequest request,   HttpServletResponse response, Object handler,   ModelAndView modelAndView);
最后执行,可用于释放资源

1 public void afterCompletion(HttpServletRequest request,   HttpServletResponse response, Object handler, Exception ex)
分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)
在preHandle中,可以进行编码、安全控制等处理;
在postHandle中,有机会修改ModelAndView;
在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。
参数中的Object handler是下一个拦截器。

如何使用拦截器?

自定义一个拦截器,要实现HandlerInterceptor接口:

Java代码

1
2
3 public class MyInteceptor implements HandlerInterceptor {          略。。。    }
Spring MVC并没有总的拦截器,不能对所有的请求进行前后拦截。
Spring MVC的拦截器,是属于HandlerMapping级别的,可以有多个HandlerMapping ,每个HandlerMapping可以有自己的拦截器。
当一个请求按Order值从小到大,顺序执行HandlerMapping接口的实现类时,哪一个先有返回,那就可以结束了,后面的HandlerMapping就不走了,本道工序就完成了。就转到下一道工序了。
拦截器会在什么时候执行呢? 一个请求交给一个HandlerMapping时,这个HandlerMapping先找有没有处理器来处理这个请求,如何找到了,就执行拦截器,执行完拦截后,交给目标处理器。
如果没有找到处理器,那么这个拦截器就不会被执行。

在spring MVC的配置文件中配置有三种方法:

方案一,(近似)总拦截器,拦截所有url

Java代码

1
2
3 <mvc:interceptors>       <bean class="com.app.mvc.MyInteceptor" />   </mvc:interceptors>
为什么叫“近似”,前面说了,Spring没有总的拦截器。

<mvc:interceptors/>会为每一 个HandlerMapping,注入一个拦截器。总有一个HandlerMapping是可以找到处理器的,最多也只找到一个处理器,所以这个拦截器总会被执行的。起到了总拦截器的作用。

方案二, (近似) 总拦截器, 拦截匹配的URL。

Xml代码

1
2
3
4
5
6 <mvc:interceptors >       <mvc:interceptor>             <mvc:mapping path="/user/*" /> <!-- /user/*  -->            <bean class="com.mvc.MyInteceptor"></bean>         </mvc:interceptor>     </mvc:interceptors>
就是比 方案一多了一个URL匹配。

方案三,HandlerMappint上的拦截器

Xml代码

1
2
3
4
5
6
7 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">         <property name="interceptors">             <list>                 <bean class="com.mvc.MyInteceptor"></bean>            </list>         </property>        </bean>
如果使用了<mvc:annotation-driven />, 它会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器。

当然我们可以通过人工配置上面的两个Bean,不使用 <mvc:annotation-driven />,就可以 给interceptors属性 注入拦截器了。


其实我也不建议使用<mvc:annotation-driven />,而建议手动写配置文件,来替代 <mvc:annotation-driven />,这就控制力就强了。

分享到:
评论

相关推荐

    SpringMVC-Mybatis-Shiro-redis-master

    SpringMVC通过DispatcherServlet进行请求分发,并使用拦截器(Interceptor)对请求进行预处理和后处理,增强了系统的灵活性和可扩展性。 **MyBatis** 是一个持久层框架,它允许开发者用简单的XML或注解来定义SQL...

    SpringMVC精品资源--SSM(spring+springmvc+mybatis)框架 Demo.zip

    5. **配置SpringMVC**:配置SpringMVC的servlet-context.xml,包括DispatcherServlet、视图解析器、拦截器等。 6. **配置MyBatis**:创建MyBatis的配置文件,包括数据源、事务管理器、SqlSessionFactory和Mapper配置...

    springmvc-mybatis-spring整合demo

    3. 配置Spring MVC:创建servlet-context.xml文件,配置DispatcherServlet、视图解析器、以及定义MVC组件如拦截器、消息转换器等。 4. 编写业务层和服务层:在Service层,我们将使用Spring的@Service注解和MyBatis的...

    SpringMVC精品资源--SSM(Spring+SpringMVC+Mybatis)新闻管理系统.zip

    掌握SpringMVC的拦截器、异常处理机制;理解Mybatis的动态SQL功能;熟悉JSP或Thymeleaf等视图技术;了解事务管理和安全性配置。 9. **实战演练**:通过运行该项目,开发者可以实践数据库操作,调试代码,查看日志,...

    springmvc-spring-hibernate 源码

    在项目中,Spring MVC的配置文件(如`spring-mvc.xml`)会定义拦截器、视图解析器、以及Controller Bean等。这些配置决定了如何路由请求、如何处理异常,以及如何渲染视图。同时,Spring MVC支持注解驱动的编程,如`...

    SpringMVC精品资源--SpringMVC+Mybatis 脚手架.zip

    此外,还可能涉及到SpringMVC的拦截器、视图解析器、异常处理等高级特性。 在实际开发中,SpringMVC和Mybatis的组合能够提供高效的Web服务和灵活的数据访问。例如,SpringMVC可以与RESTful API设计相结合,实现前后...

    SpringMVC精品资源--基于Spring + SpringMVC + Mybatis开发的登录、注册项目,使用.zip

    它通过DispatcherServlet进行请求分发,并使用拦截器(HandlerInterceptor)进行预处理和后处理操作。 **Mybatis** Mybatis是一个轻量级的持久层框架,它允许开发者直接编写SQL语句,而不是使用复杂的ORM(对象关系...

    SpringMVC精品资源--集成Spring4.x+SpringMVC+Mybatis的Java后台管理框架.zip

    2. 配置SpringMVC的DispatcherServlet,设置视图解析器、拦截器等。 3. 配置Mybatis的SqlSessionFactory,加载Mapper接口和XML配置文件。 4. 使用Spring的@Autowired注解实现依赖注入,简化代码。 5. 编写Controller...

    SpringMVC精品资源--Spring Security Core Brewery.zip

    首先,需要在SpringMVC配置中引入Spring Security的依赖,并配置相应的安全拦截器。这通常涉及到以下步骤: 1. 添加Spring Security的依赖到项目中,确保所有必要的类库可用。 2. 配置Spring Security的Web安全配置...

    springmvc-login-interceptor

    在这个名为"springmvc-login-interceptor"的项目中,我们关注的核心是Spring MVC的拦截器(Interceptor)功能,它允许开发者在请求被控制器处理之前或之后执行自定义逻辑。拦截器在实际应用中常用于权限验证、日志...

    spring + springmvc + mybatis 整合 及 mybatis-pagehelper分页

    2. **配置SpringMVC**:接着,配置SpringMVC的`web.xml`,设置DispatcherServlet,以及相关的拦截器和视图解析器。还需要在SpringMVC的配置文件(如`spring-mvc.xml`)中配置处理器映射器和适配器。 3. **配置...

    SpringMVC-Spring-Mybatis架包

    3. 配置SpringMVC:定义DispatcherServlet配置,包括视图解析器、拦截器、模型驱动等。 4. 配置Mybatis:设置Mybatis的全局配置文件,包括数据源、事务管理器、Mapper扫描等,并编写Mapper接口和XML映射文件。 5. ...

    SpringMVC中的拦截器-拦截器方法的作用和执行顺序.avi

    SpringMVC中的拦截器-拦截器方法的作用和执行顺序.avi

    springmvc-base-quick.rar

    - **servlet-context.xml**:Spring MVC 的配置文件,定义视图解析器、模型-视图映射、拦截器等。 4. **处理请求和响应:** - **@RequestParam**:用于从请求参数中获取值,绑定到控制器方法的参数。 - **Model/...

    springMVC拦截器项目

    SpringMVC 拦截器项目是一个典型的 Web 应用开发示例,它利用 SpringMVC 框架中的拦截器(Interceptor)机制来实现特定的功能,如权限控制、日志记录、性能统计等。SpringMVC 是 Spring 框架的一部分,专为构建基于 ...

    SpringMVC精品资源--Spring+Springmvc+Mybatis框架,后续集成日志插件log4j、lo.zip

    2. **SpringMVC配置**:如 dispatcher-servlet.xml,定义了SpringMVC的前端控制器、视图解析器、拦截器等。 3. **Mybatis配置**:mybatis-config.xml,包含了Mybatis的全局配置,以及Mapper接口和XML映射文件,定义...

    SpringMVC4教程-超权威--超详细

    - **拦截器**:拦截器可以用来实现日志记录、权限检查等功能,增强了应用程序的功能性。 - **配置拦截器**:通过配置Interceptor来指定哪些请求需要经过拦截器处理。 #### 十四、异常处理 - **全局异常处理**:...

    springmvc转为springboot--干货.docx

    将一个传统的Spring MVC项目迁移到Spring Boot的过程中,主要涉及到的核心技术包括Spring Boot的特性、SSM(Spring、Spring MVC、MyBatis)整合、Shiro安全框架、JSP视图解析以及Redis缓存等。以下是对这些关键点的...

    SpringMVC-Spring-Mybatis-Freemarker整合

    3. 配置Spring MVC的servlet-context.xml,声明DispatcherServlet、视图解析器(如FreeMarkerViewResolver)、拦截器等。 4. 配置Mybatis的mybatis-config.xml,包含SqlSessionFactory、Mapper接口等信息。 5. 编写...

    springmvc-high-other-05.rar

    4. **拦截器(Interceptor)**:SpringMVC提供了Interceptor机制,允许在请求处理前或后执行自定义逻辑,如权限检查、日志记录等。通过创建自定义Interceptor并注册到DispatcherServlet,我们可以实现高效且灵活的...

Global site tag (gtag.js) - Google Analytics