基于注解风格的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(); // package Name .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

转载于:https://www.cnblogs.com/siukun/archive/2011/12/06/2277647.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql命令大全

1、连接Mysql 格式&#xff1a; mysql -h主机地址 -u用户名 &#xff0d;p用户密码1、连接到本机上的MYSQL。首先打开DOS窗口&#xff0c;然后进入目录mysql\bin&#xff0c;再键入命令mysql -u root -p&#xff0c;回车后提示你输密码.注意用户名前可以有空格也可以没有空格&a…

vivado中交织模块_搞定Markdown中的图片,一劳永逸的方法!

经常用markdown写博客的朋友一定都体会过markdown图片的蛋疼之处&#xff0c;并不是说图片的这用引用方式不好&#xff0c;而且图片要放到什么服务器上&#xff1f;以我个人为例&#xff0c;写了一篇markdown&#xff0c;想在不修改任何地方的同时适用于各种平台。刚开始使用ma…

delphi xe2 project菜单怎么没有加组件功能_交互设计:让人困惑的三大交互组件及用法...

本篇文章中&#xff0c;笔者带我们了解了三大交互组件专有名词的用法&#xff0c;并结合实际案例进行了解释说明&#xff0c;与大家分享。希望通过此文能够加深你对交互组件及其用法的理解和分析。最近有很多同学来问一些设计中组件的专业名词&#xff0c;发现大家好像都没有一…

Rails 3.1 CoffeeScript SASS初体验

http://heikezhi.com/2011/04/19/how-to-rails-3-1-coffeescript-howto/http://jashkenas.github.com/coffee-script/ 转载于:https://www.cnblogs.com/orez88/articles/2278254.html

request_threaded_irq()

今天在跟marvell沟通问题的时候&#xff0c;觉得有些地方的代码看得不够仔细&#xff0c;于是细看了一下。发现了几个请求中断的函数。 request_threaded_irq&#xff0c;这个函数在内核中有注释&#xff0c;参数有好多&#xff0c;大概参数有handler&#xff0c;这是要指定的中…

磁盘 I/O 性能监控指标和调优方法

在介绍磁盘 I/O 监控命令前&#xff0c;我们需要了解磁盘 I/O 性能监控的指标&#xff0c;以及每个指标的所揭示的磁盘某方面的性能。磁盘 I/O 性能监控的指标主要包括&#xff1a;指标 1&#xff1a;每秒 I/O 数&#xff08;IOPS 或 tps&#xff09;对于磁盘来说&#xff0c;一…

中断请求request_irq

今天在跟marvell沟通问题的时候&#xff0c;觉得有些地方的代码看得不够仔细&#xff0c;于是细看了一下。发现了几个请求中断的函数。 request_threaded_irq&#xff0c;这个函数在内核中有注释&#xff0c;参数有好多&#xff0c;大概参数有handler&#xff0c;这是要指定的中…

fastapi 传输文件存文件_python3 FastAPI框架入门 基本使用, 模版渲染, 数据交互,cookie使用, 上传文件, 静态文件配置...

[FastAPI框架入门 基本使用, 模版渲染, form表单数据交互, 上传文件, 静态文件配置]安装pip3 install fastapi [all]pip3 install unicornpip3 install aiofilespip3 install HTMLResponsepip3 install Responsepip3 install shapelypip3 install starlettepip3 install reques…

android平台的s5pc110触摸屏驱动分析

内核linux2.6.35 andorid2.3 触摸屏型号ft5xo6首先给出该触摸屏的一些结构体---->drivers/input/touchscreen/ft5x06_ts.h点击(此处)折叠或打开 #ifndef __LINUX_FT5X0X_TS_H__ #define __LINUX_FT5X0X_TS_H__ #define SCREEN_MIN_X 0 #define SCREEN_MAX_X 320 #define SC…

Thread类和Runnable接口

两者都可以实现多线程&#xff0c;那么两者的区别和联系有哪些&#xff1f; Thread类的定义。 public class Thread extends Object implements Runnable 从Thread类的定义可以清楚的发现&#xff0c;Thread类也是Runnable接口的子类&#xff0c;但是Thread类中并没有完全地…

mysql的每隔1分钟定时_mysql定时任务

查看event是否开启show variables like %sche%;开启event_schedulerset global event_scheduler 1;创建存储过程spark.testCREATE PROCEDURE spark.test ()BEGINupdate spark.userbehaviordatasource set v1 3 where page like page2%;END;创建event spark.e_testcreate event…

linux powerpc i2c驱动 之 i2c设备层的注册过程

Linux下i2c驱动的加载过程&#xff0c;分为i2c设备层、i2c adapter层与i2c核心层 i2c设备驱动层也就是我们为特定i2c设备编写的驱动&#xff0c;下面是我自己理解的i2c驱动的注册过程 在我们写的i2c设备驱动中&#xff0c;我们会调用i2c_add_driver()开始i2c设备驱动的注册&am…

易宝支付碰到 交易签名无效问题 (2)

无意中翻了翻旧日的代码&#xff0c;原来在上一次交易签名无效的问题仅仅是出现在一个调用的问题上&#xff0c;merchantProperties.php被调用了两次&#xff0c;当第一次被调用的时候是正确加载的&#xff0c;而在第二次调用的时候出就会出现参数丢失的现象&#xff0c;正因为…

北斗三号b1c频点带宽_北斗三号导航信号的创新设计(一)

《测绘学报》构建与学术的桥梁 拉近与权威的距离一需求与挑战1.1 卫星导航信号的作用与意义卫星导航信号是由导航卫星向地球表面播发的无线电测量信号&#xff0c;承担着传递时空基准信息和实施被动测距两大任务&#xff0c;是卫星导航系统实现三边定位的核心载体。卫星导航信号…

g++ linux 编译开栈_linux gcc和g++版本的修改

##编译的时候容易遇到&#xff1a;unsupported GNU version! gcc versions later than 6 are not supported这样的错误。所以我们要更改系统的gcc和g编译器版本。首先我们要知道一个基础的常识&#xff0c;一般而言&#xff0c;linux系统会把gcc和g默认安装在/usr/bin/的目录下…

使用FFmpeg从视频中截图的命令

截取一张352x240尺寸大小的&#xff0c;格式为jpg的图片&#xff1a; ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg 把视频的前&#xff13;&#xff10;帧转换成一个Animated Gif &#xff1a; ffmpeg -i test.asf -vframes 30 -y -f gif a.gif 目前还没有找…

Linux I2C核心、总线与设备驱动(一)

本章导读 I2C总线仅仅使用SCL、SDA两根信号线就实现了设备之间的数据交互&#xff0c;极大地简化对硬件资源和PCB板布线空间的占用。因此&#xff0c;I2C总线被非常广泛地应用在EEPROM、实时钟、小型LCD等设备与CPU的接口中。 Linux定义了系统的I2C驱动体系结构&#xff0c;在L…

微软企业库4.1学习笔记(十)企业库的设计

在设计整个企业库的过程中&#xff0c;使用了一系列的最佳实践。下面列出一些里面的最佳实践&#xff1a; 在核心库中使用了Common模块  使用了统一的命名约定和统一的版本  在设计的过程中使用单元测试  在所有模块中包含基础结构在企业库的模块中包含了下面的模式&…

ebay注册流程_跨境电商平台eBay企业入驻流程

整个流程一共包括8个部分了解企业入驻通道企业入驻通道将帮助现有eBay大中华卖家申请并获得高刊登额度的新账户&#xff0c;以满足卖家在品类拓展以及站点拓展的需求。准备材料1.营业执照2.法人代表身份证明&#xff0c;或eBay帐户注册人身份证明&#xff08;根据地区法规有不同…

Linux I2C核心、总线与设备驱动(二)

从上面的分析可知&#xff0c;虽然I2C硬件体系结构比较简单&#xff0c;但是I2C体系结构在Linux中的实现却相当复杂。当工程师拿到实际的电路板&#xff0c;面对复杂的 Linux I2C子系统&#xff0c;应该如何下手写驱动呢&#xff1f;究竟有哪些是需要亲自做的&#xff0c;哪些是…