原文地址: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本身支持自定义拦截器,只需按如下进行配置:
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所不允许的。
分享到:
相关推荐
网上很多人想使用注解拦截spring mvc action中的一个方法,实现方法很多,一般是通过在拦截器中分析url路径来实现, 使用自定义注解的方式来标注要拦截的 action 中的某个方法, 没有很好的解决方法, 如果通过借助spring...
在这个实例中,我们将探讨如何利用MVC注解配置来简化Spring MVC应用的设置和管理。MVC模式(Model-View-Controller)是软件设计的一种经典模式,它将业务逻辑、数据和用户界面分离,使得代码更加模块化,易于维护。 ...
在实际开发中,我们还会用到Spring的其他功能,比如Spring MVC的拦截器(Interceptor)用于全局处理,`@ExceptionHandler`注解处理异常,以及Spring的单元测试支持。同时,我们还会关注性能优化,如缓存机制(如使用...
在Spring MVC中,我们可以自定义拦截器来实现预处理和后处理逻辑,如日志记录、权限检查等。定义一个拦截器需要实现`HandlerInterceptor`接口,重写`preHandle`、`postHandle`和`afterCompletion`方法。 在这个项目...
Spring MVC 拦截器是基于Java的Web开发框架Spring MVC中的一个重要组件,它允许开发者在请求被控制器处理之前或之后执行自定义逻辑。拦截器主要用于实现通用功能,如权限验证、日志记录、性能监控等,从而提高代码的...
总结起来,这个"Spring MVC注解项目实例"涵盖了Spring MVC框架的核心元素,包括注解驱动的控制器、拦截器的使用,以及数据库操作。它为初学者提供了一个动手实践的机会,帮助他们快速掌握Spring MVC的开发技巧。
4. **配置**:在 Spring MVC 中,通常使用 XML 或 Java配置来定义视图解析器、拦截器、数据源等。然而,这个超简示例可能使用了自动配置(Auto-configuration)和 Spring Boot,通过少量或无需配置即可运行。 5. **...
十五、Spring MVC处理ajax请求:讲解了如何在Spring MVC中处理异步JavaScript和XML(AJAX)请求,包括配置和控制器中的代码实现。 十六、Spring MVC关于写几个配置文件的说明:介绍了在Spring MVC项目中需要配置...
本节将深入探讨Spring MVC注解及其在实际应用中的实现方式。 首先,Spring MVC注解允许开发者以声明式的方式配置控制器,避免了传统的XML配置文件。这极大地简化了代码,提高了可读性和维护性。例如,`@...
- 注解配置:使用`@EnableWebMvc`开启Web MVC配置,并在`@Configuration`类中声明`@Bean`方法来创建拦截器,然后在`@WebMvcConfigurer`接口的实现中使用`addInterceptors()`方法来注册拦截器。 下面是一个示例,...
Spring MVC拦截器是...包括如何监听session的创建和销毁,如何实现用户的重复登录控制以及如何在拦截器中处理未登录用户的访问权限问题,这些知识点对于理解Spring MVC的请求处理流程以及实现安全机制非常有价值。
在Spring中,我们可以使用AspectJ注解来声明切面,这些注解包括`@Aspect`、`@Before`、`@After`、`@Around`等,它们分别代表前置通知、后置通知、环绕通知等不同类型的拦截器。 1. **创建切面类** 首先,我们需要...
后台通过自定义注解结合一个访问拦截器实现整个系统的权限控制 04. 系统前台采用全采用的Html+jQuery开发 05. 系统前台与后台的交互全部使用 Ajax 异步请求 06. 自定义 SecureValid 注解实现权限的控制 07. ...
1.创建第一个 Spring MVC 程序案例 2.Spring MVC @RequestMapping 注解案例 3.Spring MVC 请求参数的获取案例 4.Spring MVC 域对象共享数据案例 ...14.Spring MVC 拦截器案例 15.Spring MVC 异常处理案例
拦截器(Interceptor)是Spring MVC中的一种机制,可以在请求处理前、后执行自定义逻辑。通过实现HandlerInterceptor接口或使用@Interceptor注解,开发者可以添加全局的行为,如日志记录、权限检查等。 此外,...
- `@ModelAttribute`注解:在控制器方法的参数中使用`@ModelAttribute`可以将请求参数绑定到模型对象上,而在拦截器中,可以通过`Model`或`ModelAndView`对象来访问这些模型数据。 - `MultipartHttpServletRequest`...
同时,还需要配置Spring MVC的`servlet-context.xml`,定义DispatcherServlet的拦截器、视图解析器等。对于MyBatis,我们需要创建`mybatis-config.xml`配置文件,配置数据源、事务管理器以及映射文件的位置。 ...
在本教程中,我们将深入探讨如何使用Spring MVC、Spring和Hibernate三大框架进行全注解的整合开发。这个视频教程系列的第13部分,将帮助开发者掌握如何在Java Web项目中高效利用这些技术,实现一个现代化、高效且可...
为了实现这些功能,Spring MVC的配置文件(如servlet-context.xml)需要正确配置组件扫描、视图解析器、拦截器等。不过,现代Spring MVC项目往往倾向于使用Java配置或Spring Boot的自动配置,减少了XML的使用。 在...
后者则配置了Spring MVC的组件,如视图解析器、拦截器等。这些配置文件使得整个应用的结构清晰,易于维护。 在“测试增,删,改,查”的部分,开发者通常会创建一个或多个测试用例来验证这些基本操作。例如,创建一...