`

如何在基于注解风格的Spring-MVC中使用拦截器

阅读更多

转自  http://www.blogjava.net/atealxt/archive/2009/09/20/spring_mvc_annotation_interceptor_gae.html

 

Spring-MVC如何使用拦截器,官方文档只给出了非注解风格的例子。那么基于注解风格如何使用拦截器呢?

基于注解基本上有2个可使用的定义类,分别是DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

 

1、DefaultAnnotationHandlerMapping
DefaultAnnotationHandlerMapping本身支持自定义拦截器,只需按如下进行配置:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
     <property name="interceptors">
         <list>
                <bean class="packageName.XXXInterceptor" />
         </list>
     </property>
 </bean>

 

Interceptor的定义为:

public class XXXInterceptor extends HandlerInterceptorAdapter {
      @Override
      public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) {
   
          String className = handler.getClass().getName();// packageName.ClassName
          if (Error) {
              return false;
          }
          return true;
     }
 }

 

2、AnnotationMethodHandlerAdapter
目前,笔者没找到如何给AnnotationMethodHandlerAdapter配置自定义Interceptor的方法,但是有个customArgumentResolver可以利用一下,来充当Interceptor。

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
     <property name="customArgumentResolver">
         <bean class="packageName.XXXResolver"/>
     </property>
 </bean>

 

Resolver的定义为:

public class XXXResolver implements WebArgumentResolver {
   
      @Override
      public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception {
   
          String className = methodParameter.getMethod().getDeclaringClass().getName();// packageName.ClassName
  
          // 如何取得Response和Request
          HttpServletResponse resp = (HttpServletResponse) webRequest.getNativeResponse();
        HttpServletRequest req = (HttpServletRequest) webRequest.getNativeRequest();
  
        if (Error) {
            if (!resp.isCommitted()) resp.sendError(ERROR_STATUS);
        }
        return UNRESOLVED;    
     }
 }

 

仔细的人会看出,第二种方法其实根本不是拦截。其实第二种只是在映射Controller,调用方法的时候,给每一个方法的参数增加了一个切点。
上例在出错的时候往HttpServletResponse写错误状态,来通知web容器进行错误重定向,达到了拦截器的作用。
这么做有一个缺点,就是每个参数都有自己的切点,比如方法有3个参数就会调3次resolveArgument。为了避免出错,需要判断一下resp.isCommitted

customArgumentResolver的初衷不是用来做Interceptor的,但有些环境却不得不使用它,比如部署在GAE上。
GAE是不支持DefaultAnnotationHandlerMapping的,因为此类用到了org.springframework.beans.BeanUtils.findEditorByConvention,这个方法会调用java.lang.ClassLoader.getSystemClassLoader,而这正是GAE所不允许的。

PS:
文中提到软件的版本:
spring - 2.5.X
google app engine - 1.2.5

参考资料
http://www.scottmurphy.info/spring_framework_annotation_based_controller_interceptors
http://groups.google.com/group/google-appengine-java/browse_thread/thread/54aadf8164be7bf0

分享到:
评论

相关推荐

    网上书城 spring-mvc

    《网上书城 Spring-MVC》项目是基于Spring-MVC框架构建的一个典型电子商务平台,它展示了如何使用Spring-MVC来实现高效、灵活的Web应用程序开发。Spring-MVC是Spring框架的一部分,专门用于处理Web层的业务,提供了...

    一个改进版的spring-mvc-showcase

    总的来说,"一个改进版的spring-mvc-showcase"项目展示了如何利用Spring MVC构建一个现代Web应用,并且可能涵盖了许多高级特性,如AOP(面向切面编程)、RESTful API设计、拦截器、数据校验、异常处理等。...

    简单-利用Spring-MVC框架开发项目实例

    在本教程中,我们将深入探讨如何使用Spring-MVC框架来开发一个简单的项目实例。Spring-MVC是Spring框架的一个模块,专为构建Web应用程序提供模型-视图-控制器(MVC)架构支持。它使得开发者可以将业务逻辑、数据访问...

    mdeinum-pro-spring-mvc-code

    在这个过程中,Spring MVC提供了丰富的自定义点,如拦截器(Interceptor)可以扩展处理逻辑,数据绑定和验证可以确保输入的有效性,异常处理机制可以优雅地管理错误情况。 在"mdeinum-pro-spring-mvc-code"项目中,...

    Spring-MVC框架简单实现

    这个简易版的 Spring MVC 框架可能没有包含所有的特性,如拦截器、国际化、上传下载等,但它足以帮助初学者理解 Spring MVC 的基本工作原理。在实际项目中,开发者可以根据需求逐步添加和配置更多功能,以构建更复杂...

    spring-mvc 官方实例

    Spring MVC 是 Spring 框架的一个重要组成部分,用于构建基于模型-视图-控制器(Model-View-Controller)架构的Web应用程序。这个官方实例“spring-mvc-showcase”旨在为开发者提供一个清晰的理解和实践Spring MVC...

    spring-mvc helloworld demo

    - `dispatcher-servlet.xml` 是 Spring MVC 的配置文件,其中定义了视图解析器、拦截器、模型-视图对以及其他组件。 4. **编写 Controller**: - 创建一个简单的 `HelloWorldController` 类,该类包含一个处理...

    spring-mvc-showcase.zip

    在Spring Boot中,通常通过`WebMvcConfigurer`或`WebMvcConfigurerAdapter`进行自定义配置,如拦截器、视图解析器、消息转换器等。 十、RESTful API 通过`@RestController`注解,可以创建RESTful服务,处理JSON或...

    spring-mvc.rar_spring mvc

    8. **MVC配置文件**:在Spring MVC中,通常会有一个或多个配置文件(如spring-mvc.xml)来定义组件扫描、视图解析器、拦截器等设置。 9. **Spring JDBC/ORM集成**:Spring提供了与JDBC的集成,简化了数据库操作,...

    Spring-MVC的demo

    一个典型的Spring MVC应用需要配置DispatcherServlet、视图解析器、拦截器等。XML配置或Java配置都可以,现在更推荐使用Java配置,因为更直观且易于维护。 10. **单元测试与集成测试** Spring MVC提供测试支持,...

    spring-mvc实例

    2. **配置文件**:Spring MVC的配置通常在`spring-servlet.xml`或`applicationContext.xml`文件中进行,包括视图解析器(如`InternalResourceViewResolver`)、拦截器(如`HandlerInterceptor`)、以及处理器映射器...

    spring-mvc-helloworld

    在 `spring-mvc-helloworld` 项目中,可能会包含一个 `web.xml` 文件来配置 DispatcherServlet。此外,还需要 Spring MVC 的配置文件(如 `servlet-context.xml`),其中定义了 Controller、视图解析器和其他组件的...

    spring-web.jar spring-webmvc.jar

    在本讨论中,我们将深入探讨两个核心组件——`spring-web.jar`和`spring-webmvc.jar`,它们在Spring MVC框架中扮演着关键角色。 首先,`spring-web.jar`是Spring框架的Web层组件,它提供了与Web相关的功能。这个库...

    spring-mvc+mybatis+mysql简单实例

    在Web开发中,Spring-MVC、MyBatis和MySQL的组合是常见的技术栈,它们为构建高效、可维护的Web应用程序提供了强大的支持。本实例将深入探讨这三者如何协同工作,以实现数据的增删查改(CRUD)操作。 首先,Spring-...

    spring-mvc-showcase-master

    在 Spring MVC 中,可以通过 @ModelAttribute 注解将对象绑定到请求或响应。 3. **Controller**:控制器层,处理来自客户端的请求,调用业务逻辑,然后将结果返回给视图。控制器类通常使用 @Controller 注解标识,...

    spring-mvc-mybatis

    - **Spring MVC配置**:配置视图解析器、拦截器、以及RequestMapping的扫描路径。 5. **项目运行流程** - 用户发送HTTP请求到DispatcherServlet。 - DispatcherServlet查找并调用对应的Controller方法。 - ...

    spring-mvc-study.zip_spring mvc_spring mvc项目_springmvc

    - **MVC配置**:通常在 `WebConfig.java` 或者 `spring-servlet.xml` 文件中配置,包括拦截器、视图解析器、转换器、格式化器等。 本项目 "spring-mvc-study" 对于初学者来说是一个很好的起点,它提供了一个基础的 ...

    spring-mvc-demo

    在 `src/main/resources` 目录下,`spring-servlet.xml` 文件是 Spring MVC 的核心配置文件,用于配置视图解析器、URL 映射、拦截器等。此外,可能还有 `web.xml` 文件,它是传统的 Servlet 容器的部署描述符,用于...

    spring-webmvc-struts.jar

    `spring-webmvc-struts.jar`是Spring框架为了与Struts框架集成而设计的一个模块,它提供了对Struts应用的Spring支持,使得开发者可以在Struts应用中利用Spring的特性,如依赖注入(DI)、面向切面编程(AOP)等。...

    spring-mvc的简单实现

    在实际开发中,Spring MVC提供了许多高级特性,如数据绑定、模型验证、本地化、主题支持、拦截器等,使得构建复杂的Web应用程序变得更加容易和灵活。通过深入学习和实践,你可以逐步掌握Spring MVC的更多功能,提升...

Global site tag (gtag.js) - Google Analytics