Spring 的处理器映射 支持 拦截器, 当想为某些请求提供特殊功能的时候, 他们就可以派上用场了.
首先 处理器映射 中的 拦截器 必须实现 org.springframework.web.servlet 包中的
HandlerInterceptor 接口. 该接口定义了三个方法, 一个在
处理器执行前调用, 一个在
处理器执行后调用, 另一个在
整个请求处理完后调用. 为什么强调,因为在 org.springframework.web.portlet 包中也有个同名的接口, 但跟这里讨论的没关系.
有意思的是
preHandler(...) 方法, 它有一个boolean返回值, 利用这一点, 可以调整 HandlerExecutionChain 的执行 行为. 当它返回 true 时, 处理器执行链将继续执行下去; 当它返回 false 时, DispatcherServlet将认为请求已经被处理完成, 不再继续执行 HandlerExecutionChain 中的其他 处理器 和 拦截器.
下面, 是一个拦截器的例子, 它会拦截所有请求 ( 相对处理器执行而言 ), 只要当前时间不在9:00~12:00和13:00~18:00这两个时间段, 就会把用户重定向到某个特殊的页面去.
首先是Spring配置文件中针对 处理器影射 的这一块 :
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="officeHoursInterceptor"/>
</list>
</property>
<property name="mappings">
<props>
...
</props>
</property>
</bean>
<bean id="officeHoursInterceptor" class="interceptor.OfficeHoursInterceptor"/>
下面就是拦截器类了:
package interceptor;
public class OfficeHoursInterceptor extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
if ( (hour >= 9 && hour <= 12) || (hour >= 13 && hour <=18) ){
return true;
}else{
String host = request.getHeader("host");
if (host != null && host.trim().length() > 0){
response.sendRedirect("http://"+host+"/sprapp/notime.jsp");
}else{
response.sendRedirect("http://10.5.2.67:8080/sprapp/notime.jsp");
return false;
}
}
}
//注意啦,没有直接实现 HandlerInterceptor 接口, 而是选择了继承一个更加方便的 抽象类,因为我们自己的拦截器不一定要把接口的每个方法都实现啊! 这个抽象类 HandlerInterceptorAdapter,直接实现了 HandlerInterceptor 接口,但是三个方法都是空实现 (自己的词儿,就是没有方法体啦), 所以等着子类去覆盖呢.
最后简单介绍另两个方法:
[1] postHandler : 无返回. 这个方法的调用, 发生在 HandlerAdapter 实际调用了处理器之后, 但 DispatcherServlet 还没来得及渲染 视图 的时候.
这个方法是唯一具有 ModelAndView 参数的, 也就是说,可以利用这个方法, 在处理器返回的ModelAndView的基础上,做点儿小动作 ( 有什么好主意自己一边儿想去吧 ) ,然后再由 DispatcherServlet 去渲染视图.
[2] afterCompletion : 无返回. 这个方法调用 发生在 请求被处理完毕之后. 也就是视图渲染完成之后. 通常用来做一些资源清理的工作.
分享到:
相关推荐
- 提供的课程资源覆盖了SpringMVC的多个关键主题,包括概述、处理器映射、请求映射、参数绑定、数据校验、异常处理、文件上传、JSON交互和拦截器。这些章节旨在帮助开发者全面理解和应用SpringMVC框架。 通过学习...
本实例代码着重讲解了SpringMVC中的四种映射方式以及拦截器的实现,这对于理解和掌握SpringMVC的请求处理机制至关重要。 1. **四种映射方式**: - **通配符映射**:`@RequestMapping("/path/*")`,星号(*)代表任意...
最后,为了使拦截器生效,需要将其注册到Spring MVC的处理器链中。这可以通过在`WebMvcConfigurer`的实现类中重写`addInterceptors`方法来完成: ```java @Configuration public class WebConfig implements ...
SpringMVC框架是Java开发中广泛使用的Web MVC框架,它为开发者提供了强大的功能,包括模型-视图-控制器模式的支持、数据绑定、异常处理、以及我们这里关注的拦截器(Interceptor)。拦截器在SpringMVC中扮演着重要的...
SSM登录与查询拦截器DEMO是一个典型的Java Web开发示例,它利用了Spring、Spring MVC和MyBatis(SSM)三大框架的集成,来实现用户登录验证和查询操作的拦截处理。这个DEMO旨在帮助初学者理解如何在实际项目中应用...
例如,我们可以定义`WebMvcConfigurer`的实现,来添加、排除或调整处理器映射、视图解析器等。 4. **HTTPS配置**: HTTPS是一种使用SSL/TLS协议的HTTP,用于加密通信和验证服务器身份。在Spring Boot中,我们可以...
框架的核心架构包括前端控制器DispatcherServlet、请求到处理器映射HandlerMapping、处理器适配器HandlerAdapter、视图解析器ViewResolver等组件。 1. **前端控制器DispatcherServlet**: 当用户发起请求时,...
SSM+拦截器+Mysql基础性框架是一个适合新手入门的Java Web开发组合,它包含了Spring、SpringMVC和MyBatis三个核心组件,以及基于这些组件实现的拦截器技术与MySQL数据库的集成。这个框架提供了完整的后端服务构建...
MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。在本项目中,MyBatis将作为数据访问层,用于执行SQL语句并与数据库进行...
综上所述,配置Spring MVC请求的默认处理器涉及到web.xml的DispatcherServlet配置、Spring MVC配置文件的编写以及处理器映射、适配、拦截器和异常处理等相关组件的设置。理解并熟练掌握这些知识点,对于开发高效、...
- 拦截器可以在请求到达处理器之前或之后执行自定义逻辑,例如日志记录、权限检查、性能统计等。 - 实现`HandlerInterceptor`接口并注册到Spring MVC,就可以创建自定义的拦截器。 6. **异常处理**: - Spring ...
• 多个拦截器,即 HANDLERINTERCEPTOR 4、前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)。 5、处理器适配器去执行Handler。 6、处理器执行完给处理器适配器返回...
本项目是一个基于Spring 4的Spring MVC实现,内含登录功能和拦截器,可以直接运行,为开发者提供了一个快速开发的基础模板。 首先,让我们详细了解一下Spring MVC的核心概念: 1. **DispatcherServlet**:它是...
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 4、 DispatcherServlet调用HandlerAdapter处理器适配器。 5、 ...
SpringMVC 拦截器(HandlerInterceptor)是 SpringMVC 框架中的一个重要组成部分,它在请求处理之前、之后以及视图渲染之前执行,提供了预处理和后处理的功能。这个入门实例是为了帮助开发者理解如何在实际项目中...
在上面的配置中,我们定义了一个名为myInterceptor的拦截器,并将其添加到处理器映射中。 自定义拦截器需要实现HandlerInterceptor接口,该接口定义了三个方法: * preHandle:在处理器执行之前调用 * postHandle...
在创建后,都会通过`interceptorChain.pluginAll()`方法将所有注册的拦截器应用到这些处理器上,形成被拦截的版本。 Executor的执行过程中,拦截器可以拦截以下步骤: - 对Executor的query()、update()等方法的...
最后,学习拦截器,你需要知道如何注册拦截器,实现拦截器的preHandle、postHandle和afterCompletion方法,以及如何在拦截器链中进行逻辑处理。 总的来说,这个压缩包提供了一个全面学习SpringBoot、SpringMVC、...
拦截器是在Spring MVC处理器映射之后被调用的,因此它们可以访问请求和响应对象,以及处理器(Handler)对象。 需要注意的是,当拦截器的preHandle方法返回false时,后续的拦截器或控制器不会被执行。当拦截器的...