- 浏览: 34434 次
- 性别:
- 来自: 南京
最新评论
HandlerInterceptor接口的代码如下:
下面对代码中的三个方法进行解释。
preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回请求前被调用,在该方法中对用户请求request进行处理。
afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
下面通过一个例子来说明如何使用SpringMVC框架的拦截器。
现在要编写一个拦截器,拦截所有不在工作时间的请求,把这些请求转发到一个特定的静态页面,而不对它们的请求进行处理。
首先编写TimeInterceptor.Java,代码如下:
可以看出,上面的代码重载了preHandle()方法,该方法在业务处理器处理请求之前被调用。在该方法中,首先获得当前的时间,判断其是否在 openingTime和closingTime之间,如果在,返回true,这样才会调用业务控制器去处理该请求;否则直接转向一个页面,返回 false,这样该请求就不会被处理。
下面是在dispatcher-servlet.xml中对拦截器进行的配置,代码如下:
可以看出,上面代码用bean</span>标签去定义TimeInterceptor,令其id为officeHoursInterceptor,并给它的3个 属性赋值。具体的大家可以运行一下项目看看。
说 明:控制反转是Spring</span>框架的核心思想,即用一个接口去定义一些操作,在接口的实现类中去重写这些操作,然后在Spring的配置 文件中去把该接口的实现类注入到应有框架中,这样就可以通过调用接口去调用接口的实现类。此次讲的拦截器就体现了这种思想,即实现 HandlerInterceptorAdapter接口,重写preHandle()方法并在配置文件中实现TimeInterceptor的注入。这
样当框架调用HandlerInterceptorAdapter时,就可以调用到TimeInterceptor类的preHandle()方法。
package org.springframework.web.servlet; import Javax.servlet.http.HttpServletRequest; import Javax.servlet.http.HttpServletResponse; public interface HandlerInterceptor { // preHandle()方法在业务处理器处理请求之前被调用 boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception; // postHandle()方法在业务处理器处理请求之后被调用 void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; // afterCompletion()方法在DispatcherServlet完全处理完请求后被调用 void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; }
下面对代码中的三个方法进行解释。
preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回请求前被调用,在该方法中对用户请求request进行处理。
afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
下面通过一个例子来说明如何使用SpringMVC框架的拦截器。
现在要编写一个拦截器,拦截所有不在工作时间的请求,把这些请求转发到一个特定的静态页面,而不对它们的请求进行处理。
首先编写TimeInterceptor.Java,代码如下:
package com.yjde.web.interceptor; import java.util.Calendar; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; public class TimeInterceptor extends HandlerInterceptorAdapter { // 继承HandlerInterceptorAdapter类 private int openingTime; // openingTime 属性指定上班时间 private int closingTime; // closingTime属性指定下班时间 private String outsideOfficeHoursPage;// outsideOfficeHoursPage属性指定错误提示页面的URL // 重写 preHandle()方法,在业务处理器处理请求之前对该请求进行拦截处理 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Calendar cal = Calendar.getInstance(); int hour = cal.get(Calendar.HOUR_OF_DAY); // 获取当前时间 if (openingTime <= hour && hour < closingTime) { // 判断当前是否处于工作时间段内 return true; } else { response.sendRedirect(outsideOfficeHoursPage); // 返回提示页面 return false; } } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView mav) throws Exception { System.out.println("postHandle"); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception excptn) throws Exception { System.out.println("afterCompletion"); } public int getOpeningTime() { return openingTime; } public void setOpeningTime(int openingTime) { this.openingTime = openingTime; } public int getClosingTime() { return closingTime; } public void setClosingTime(int closingTime) { this.closingTime = closingTime; } public String getOutsideOfficeHoursPage() { return outsideOfficeHoursPage; } public void setOutsideOfficeHoursPage(String outsideOfficeHoursPage) { this.outsideOfficeHoursPage = outsideOfficeHoursPage; } }
可以看出,上面的代码重载了preHandle()方法,该方法在业务处理器处理请求之前被调用。在该方法中,首先获得当前的时间,判断其是否在 openingTime和closingTime之间,如果在,返回true,这样才会调用业务控制器去处理该请求;否则直接转向一个页面,返回 false,这样该请求就不会被处理。
下面是在dispatcher-servlet.xml中对拦截器进行的配置,代码如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 使Spring支持自动检测组件,如注解的Controller --> <context:component-scan base-package="com.yjde.web.controller" /> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> <mvc:interceptors> <mvc:interceptor> <!--设置拦截的路径--> <mvc:mapping path="/login1.htm" /> <mvc:mapping path="/login2.htm" /> <bean class="com.yjde.web.interceptor.TimeInterceptor"> <!--openingTime 属性指定上班时间--> <property name="openingTime"> <value>12</value> </property> <!--closingTime属性指定下班时间--> <property name="closingTime"> <value>14</value> </property> <!--outsideOfficeHoursPage属性指定提示页面的URL--> <property name="outsideOfficeHoursPage"> <value>http://localhost:8080/SpringMVCInterceptor/jsp/outsideOfficeHours.jsp </value> </property> </bean> </mvc:interceptor> </mvc:interceptors> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="message"> </bean> </beans>
可以看出,上面代码用bean</span>标签去定义TimeInterceptor,令其id为officeHoursInterceptor,并给它的3个 属性赋值。具体的大家可以运行一下项目看看。
说 明:控制反转是Spring</span>框架的核心思想,即用一个接口去定义一些操作,在接口的实现类中去重写这些操作,然后在Spring的配置 文件中去把该接口的实现类注入到应有框架中,这样就可以通过调用接口去调用接口的实现类。此次讲的拦截器就体现了这种思想,即实现 HandlerInterceptorAdapter接口,重写preHandle()方法并在配置文件中实现TimeInterceptor的注入。这
样当框架调用HandlerInterceptorAdapter时,就可以调用到TimeInterceptor类的preHandle()方法。
发表评论
-
mybatis功能之spring自动代理完成dao的实现类功能
2017-03-14 15:24 1824之前在写包的时候会划分为dao层,service层,actio ... -
servlet的URL匹配规则总结
2015-10-10 11:30 4501. 写法 ①完全匹配:以“/”开头,以字母( ... -
SSH错误:java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config
2015-10-08 18:24 745java.lang.ClassNotFoundExceptio ... -
电话簿项目笔记-----------Model和DAO设计
2015-09-08 14:27 626(一)在Eclipse中创建Dynamic Web Proje ... -
spring mvc demo里面tomcat启动错误问题解决
2015-09-08 13:50 1475环境: eclipse+tomcat 7 +j ... -
电话簿项目笔记-----------数据库设计
2015-09-07 14:00 565(一)数据库设计 1 电话簿拥有者信息表(ownernu ... -
电话簿项目笔记-----------整体设计
2015-09-07 13:55 4471、框架选择 后台:Spring3+Mybaiti ...
相关推荐
SpringMVC自定义拦截器实现过程详解 SpringMVC自定义拦截器是指在SpringMVC框架中,开发者可以自定义一些拦截器来实现特定的功能。拦截器是AOP思想的具体应用,用于对处理器进行预处理和后处理。在SpringMVC框架中...
自定义拦截器是扩展Spring MVC功能、添加自定义行为的一种常见方式。以下是对自定义拦截器实现步骤的详细解释: ### 1. 自定义拦截器类 #### 1.1 继承 `HandlerInterceptorAdapter` 你可以选择继承`...
- 自定义拦截器需要继承`HandlerInterceptor` 或 `HandlerInterceptorAdapter` 类,并重写相关方法。 - `preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)`:在请求处理之前...
《SpringMVC 拦截器详解》 在SpringMVC框架中,拦截器(Interceptor)扮演着不可或缺的角色,它允许开发者在请求被处理器处理之前和之后进行额外的操作,如日志记录、权限验证、性能统计等。拦截器机制极大地扩展了...
2. 在 springmvc.xml 中配置自定义拦截器 在 springmvc.xml 文件中,需要配置自定义拦截器,例如:<mvc:interceptors><bean class="com.example.MyInterceptor"/></mvc:interceptors> 四、拦截器的应用场景 拦截...
在本章中,我们将深入探讨"处理器拦截器"在SpringMVC框架中的应用与实现,这是SpringMVC中一个至关重要的组件,它允许我们在请求处理前后执行自定义逻辑。通过学习这一主题,我们可以更好地理解SpringMVC的工作流程...
本教程“跟开涛学SpringMVC(5)处理器拦截器详解”深入解析了这个核心概念,帮助Java开发者提升其应用的灵活性和可维护性。 处理器拦截器在Spring MVC中的主要职责包括: 1. **预处理**:在请求到达目标控制器...
创建自定义拦截器需要继承`HandlerInterceptorAdapter`抽象类,并重写相关方法。例如: ```java public class AuthInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle...
2. **在拦截器中进行资源判断**:你可以在自定义拦截器类中添加逻辑,检查请求的URL是否属于静态资源。如果是,就直接放行。例如,可以在 `LoginInterceptor` 类中设置一个属性 `allowUrls`,包含不拦截的资源路径,...
**SpringMVC CAS Maven SSO详解** 在现代Web应用程序开发中,单一登录(Single Sign-On, SSO)已经成为一种常见的身份验证解决方案,它允许用户在一个系统中登录后,无需再次输入凭证即可访问其他关联系统。CAS...
SpringMVC提供了两种方式来实现自定义拦截器: 1. **实现HandlerInterceptor接口**:这是最常见的实现方式,用户需要实现`preHandle`、`postHandle`和`afterCompletion`三个方法。 ```java public class ...
在实际开发中,如果需要自定义拦截器,可以通过实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter抽象类来实现。例如,一个自定义的AuthInterceptor拦截器,可以在preHandle方法中实现用户权限验证,...
综上所述,SpringMVC拦截器提供了一种灵活的方式来在请求处理前后添加自定义的处理逻辑,通过拦截器的配置与实现,开发者可以对Web应用进行多维度的控制和扩展。在实际开发中,根据业务需求选择合适的拦截时机和逻辑...
最后,"struts2拦截器详解之二:深入理解struts2拦截器机制.txt"和"Struts2自定义拦截器.txt"文件详细阐述了Struts2的拦截器机制。拦截器是Struts2的核心特性之一,它们是围绕Action执行的一系列拦截动作,可以在...
总结起来,这个示例展示了如何通过Spring MVC的拦截器和自定义注解来控制Controller方法的返回值。在开发过程中,你可以利用这个机制快速地构建和测试接口,而不需要每次都编写完整的方法实现。这种灵活性有助于提高...
这些理解有助于我们定制化SpringMVC的行为,比如自定义拦截器、异常处理器等。 此外,SpringMVC中的AOP(面向切面编程)和IoC(控制反转)概念也值得深入研究。AOP用于实现如日志记录、事务管理等功能,而IoC则是...
自定义拦截器需实现`HandlerInterceptor`接口,然后在`web.xml`或Spring配置中注册。 在实际项目中,SpringMVC可以与其他技术结合,如MyBatis、RESTful API等,构建复杂的企业级应用。理解并熟练掌握SpringMVC的...
第五章《处理器拦截器详解》: 本章深入到SpringMVC的拦截器机制,这些拦截器可以在请求处理之前和之后执行额外的逻辑,如日志记录、权限检查等。文档可能会展示如何自定义拦截器并将其注册到SpringMVC配置中。 第...
例如,你可以定义`@Bean`方法来创建Controller实例,设置视图解析器,以及添加自定义拦截器。 - `@EnableWebMvc`注解:用于开启SpringMVC的自动配置,这使得JavaConfig成为可能。 - `WebMvcConfigurer`接口:提供...
10. **拦截器(Interceptor)**:SpringMVC支持拦截器,可以在请求处理前后执行自定义逻辑,例如登录检查、日志记录等。 以上就是SpringMVC入门中的表单处理相关知识点。通过这些基础,开发者可以轻松地构建表单...