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

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本身支持自定义拦截器,只需按如下进行配置:

1 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
2     <property name="interceptors">
3         <list>
4                <bean class="packageName.XXXInterceptor" />
5         </list>
6     </property>
7 </bean>

Interceptor的定义为:

 1 public class XXXInterceptor extends HandlerInterceptorAdapter {
2     @Override
3     public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) {
4
5         String className = handler.getClass().getName();// packageName.ClassName
6         if (Error) {
7             return false;
8         }
9         return true;
10     }
11 }

2、AnnotationMethodHandlerAdapter

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

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

Resolver的定义为:

 1 public class XXXResolver implements WebArgumentResolver {
2
3     @Override
4     public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception {
5
6         String className = methodParameter.getMethod().getDeclaringClass().getName();// packageName.ClassName
7
8         // 如何取得Response和Request
9         HttpServletResponse resp = (HttpServletResponse) webRequest.getNativeResponse();
10        HttpServletRequest req = (HttpServletRequest) webRequest.getNativeRequest();
11
12        if (Error) {
13            if (!resp.isCommitted()) resp.sendError(ERROR_STATUS);
14        }
15        return UNRESOLVED;
16     }
17 }
18

仔细的人会看出,第二种方法其实根本不是拦截。其实第二种只是在映射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

时间: 2024-10-31 11:11:42

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

spring mvc xml配置拦截器

spring mvc 有两种配置:(1)注解:(2)基于xml(schema). 公司要求使用xml方式的,其实在我看来注解更方便: 如何使用xml配置spring mvc的拦截器呢? 场景:比如用户通过浏览器访问我的网站时,我需要判断用户是否已经登录过,若登录过,则允许访问,否则自动跳转到登陆页面. spring mvc中拦截器类需要继承HandlerInterceptorAdapter 类 代码如下: Java代码   package com.yj.mvc.controler.interce

使用Spring 2.5基于注解驱动的Spring MVC

概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 XML 配置文件中定义请求和 Controller 的映射关系,仅仅使用注解就可以让一个 POJO 具有 Controller 的绝大部分功能 -- Spring MVC 框架的易用性得到了进一步的增强.在框架灵活性.易用性和扩展性上,Spring MVC 已经全面超越了其它的 MVC 框架,伴随

Spring源代码解析(七):Spring AOP中对拦截器调用的实现

前面我们分析了Spring AOP实现中得到Proxy对象的过程,下面我们看看在Spring AOP 中拦截器链是怎样被调用的,也就是Proxy模式是怎样起作用的,或者说Spring是怎样为 我们提供AOP功能的: 在JdkDynamicAopProxy中生成Proxy对象的时候: Java代码 return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this); 这里的this参数对应的是InvocationHandler对象

Spring MVC中基于自定义Editor的表单数据处理技巧分享_java

面向对象的编程方式极大地方便了程序员在管理数据上所花费的精力.在基于Spring MVC的Web开发过程当中,可以通过对象映射的方式来管理表单提交上来的数据,而不用去一个一个地从request中提取出来.另外,这一功能还支持基本数据类型的映射.例如in.long.float等等.这样我们就能从传统单一的String类型中解脱出来.然而,应用是灵活的.我们对数据的需求是千变万化的.有些时候我们需要对表单的数据进行兼容处理. 例如日期格式的兼容: 中国的日期标注习惯采用yyyy-MM-dd格式,欧美

Http请求中Content-Type讲解以及在Spring MVC中的应用

引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值,以及在Spring MVC中如何使用它们来映射请求信息. Content-Type MediaType,即是Internet Media Type,互联网媒体类型:也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息. [html] view pl

Spring MVC 中的异常处理 (handling exceptions)

在任何应用开发中都需要对异常情况做处理,web应用也是如此.但是在Spring MVC中,所有的Request都是由Servlet处理的,返回的结果都是Response.也就是说,无论请求过程中出现什么异常,返回的都是一个Response,所有异常信息都要转换成Response. 当然,Spring提供了多种异常信息到Response信息的转换方式: 1. 一些特定的Spring异常已经被自动映射特定的http status code 2. 我们可以通过@ResponseStatus注解将一个异

spring MVC中定义异常页面

如果我们在使用Spring MVC的过程中,想自定义异常页面的话,我们可以使用DispatcherServlet来指定异常页面,具体的做法很简单: 下面看我曾经的一个项目的spring配置文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns=

Spring MVC 中的@RequestMapping(method = RequestMethod.OPTIONS)无法拦截

问题描述 Spring MVC 中的@RequestMapping(method = RequestMethod.OPTIONS)无法拦截,貌似这个注解不能拦截OPTIONS方法,get,post,put都能,为什么这个不能,有什么解决办法 解决方案 这里给个提示,看是否解决:http://stackoverflow.com/questions/23103832/spring-mvc-does-not-handle-requestmethod-options

Spring MVC 中 短信验证码功能的实现方法_java

在外部网站中短信的验证很有必要,比如在实现注册.验证用户信息等的情况下.在SpringMVC中的实现如下: 短信接口 短信接口,有些企业会购买的有移动的短信平台接口.如果是个人或者是小企业可以使用一些云服务的.比如百度的API Store上面的. 我使用的是:http://apistore.baidu.com/apiworks/servicedetail/1018.html 当然短信接口肯定都是要付费的,而且是基于模板的,具体的使用说明可以看这个网址里面的使用说明. 前端界面 前端的界面,可能如