`
123003473
  • 浏览: 1061464 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

spring-mvc 的 拦截器应用例子

 
阅读更多
23.4  使用拦截器
和Struts2一样,Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口。
【示例23-9】HandlerInterceptor接口的代码如下:

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完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
下面通过一个例子来说明如何使用Spring MVC框架的拦截器。
【示例23-10】要求编写一个拦截器,拦截所有不在工作时间的请求,把这些请求转发到一个特定的静态页面,而不对它们的请求进行处理。
首先编写TimeInterceptor.Java,代码如下:

package com.examp.ch23;  
import Java.util.Calendar;  
import Javax.servlet.http.HttpServletRequest;  
import Javax.servlet.http.HttpServletResponse;  
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  
    public void setOpeningTime(int openingTime) {  
        this.openingTime = openingTime;  
    }  
    public void setClosingTime(int closingTime) {  
        this.closingTime = closingTime;  
    }  
    public void setOutsideOfficeHoursPage(String outsideOfficeHoursPage) {  
        this.outsideOfficeHoursPage = outsideOfficeHoursPage;  
    }  
    //重写 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;  
        }  
    }  
} 

可以看出,上面的代码重载了preHandle()方法,该方法在业务处理器处理请求之前被调用。在该方法中,首先获得当前的时间,判断其是否在 openingTime和closingTime之间,如果在,返回true,这样才会调用业务控制器去处理该请求;否则直接转向一个静态页面,返回 false,这样该请求就不会被处理。
下面是在dispatcherServlet-servlet.xml中对拦截器进行的配置,代码如下:
<bean id="urlMapping" class="org.springframework.web.servlet.handler.Simple-  
UrlHandlerMapping">  
        <property name="mappings">  
            <props>  
                <prop key="helloWorld.do">helloWorldAction</prop>  
                <prop key="login.do">loginController</prop>  
            </props>  
        </property>  
        <property name="interceptors">  
                                <!--在interceptors 属性中定义所有的拦截器-->  
            <list>  
                <ref bean="officeHoursInterceptor"/>  
                                <!--引用officeHoursInterceptor 拦截器-->  
            </list>  
        </property>  
          
</bean>  
<!--定义TimeInterceptor拦截器,id为officeHoursInterceptor -->  
<bean id="officeHoursInterceptor" 
      class="com.examp.ch23.TimeInterceptor">  
    <!--openingTime 属性指定上班时间-->  
    <property name="openingTime"><value>9</value></property>  
    <!--closingTime属性指定下班时间-->  
    <property name="closingTime"><value>18</value></property>  
     <!--outsideOfficeHoursPage属性指定提示页面的URL-->  
    <property name="outsideOfficeHoursPage"><value>http://localhost:8080/  
    ch23/outsideOfficeHours.html</value></property>  
</bean> 

可以看出,上面代码用bean标签去定义TimeInterceptor,令其id为officeHoursInterceptor,并给它的3个 属性赋值。在urlMapping中通过<property name="interceptors">去指定officeHoursInterceptor为一个拦截器,读者可以在<list> 和</list>之间定义多个拦截器。
outsideOfficeHours.html的代码很简单,只是输出一句提示语。
运行程序,在浏览器中随便访问一个页面,如果请求的时间在9点~18点之间,则该请求可以被处理;否则,返回一句提示语,如图23-5所示。

(点击查看大图)图23-5  请求被拦截效果图
说 明:在第22章中介绍过控制反转是Spring框架的核心思想,即用一个接口去定义一些操作,在接口的实现类中去重写这些操作,然后在Spring的配置 文件中去把该接口的实现类注入到应有框架中,这样就可以通过调用接口去调用接口的实现类。本节讲的拦截器就体现了这种思想,即实现 HandlerInterceptorAdapter接口,重写preHandle()方法并在配置文件中实现TimeInterceptor的注入。这 样当框架调用HandlerInterceptorAdapter时,就可以调用到TimeInterceptor类的preHandle()方法。
分享到:
评论

相关推荐

    简单-利用Spring-MVC框架开发项目实例

    此外,为了使项目更具可扩展性,我们还可以引入其他Spring-MVC特性,如拦截器(Interceptor)来处理全局请求,AOP(面向切面编程)来实现跨切面的逻辑,以及数据绑定和验证机制。 总的来说,Spring-MVC提供了强大的...

    spring-mvc的例子

    项目名称“spring-mvc-showcase”暗示这是一个示例或演示项目,可能会包含各种Spring MVC的功能示例,如RESTful API、表单处理、异常处理、国际化、视图解析、拦截器、模型绑定等。开发者可以通过这个项目学习和理解...

    Spring MVC 拦截器入门例子

    通过理解并实践Spring MVC的拦截器,你可以有效地扩展和优化应用程序的功能,同时保持代码的整洁和模块化。这不仅有助于提高开发效率,也能为系统的维护和升级带来便利。所以,学习和掌握Spring MVC的拦截器对于任何...

    spring-mvc的简单实现

    在实际开发中,Spring MVC提供了许多高级特性,如数据绑定、模型验证、本地化、主题支持、拦截器等,使得构建复杂的Web应用程序变得更加容易和灵活。通过深入学习和实践,你可以逐步掌握Spring MVC的更多功能,提升...

    spring mvc step by step,例子

    2. **配置Spring MVC**:在`web.xml`中配置`DispatcherServlet`,并添加Spring MVC的配置文件,如`spring-mvc.xml`,在这里定义视图解析器、拦截器、bean等。 3. **编写Controller**:创建一个控制器类,使用`@...

    超简单的Spring-mvc示例

    Spring MVC 是一个强大的Java web开发框架,用于构建高效、可维护...通过深入学习和实践,你可以进一步了解Spring MVC的高级特性,如拦截器、模型绑定、数据验证等,从而更好地利用Spring MVC构建复杂的企业级Web应用。

    spring-mvc-step-by-step.pdf

    - **拦截器与AOP**:探索Spring的拦截器机制以及面向切面编程(AOP)在Spring MVC中的应用。 - **异常处理**:如何优雅地处理应用运行时可能出现的异常。 - **国际化与本地化**:支持多语言环境的实现方法。 - **...

    spring-webmvc-portlet.rar

    5. **拦截器**:允许在请求处理前后插入自定义逻辑,如权限检查、日志记录等。 二、Portlet框架 Portlet框架是为portlet容器(如Liferay、WebSphere Portal)提供的一套标准,它定义了portlet的生命周期、渲染机制...

    一个简单的Spring-MVC例子.doc

    在 Spring 中,可以使用 Advisor 或拦截器(Interceptor)来实现方面。 - **连接点(Joinpoint)**:连接点是程序执行中的一个特定点,如方法的调用。Spring 支持在这些点插入 AOP 代码。 - **通知(Advice)**:...

    一个简单的Spring-MVC例子.pdf

    拦截器在Spring和其他基于拦截的AOP框架中广泛使用,它们在处理如事务管理、日志记录等跨切关注点时发挥着重要作用。 总之,Spring-MVC中的AOP提供了强大的工具,用于解耦业务逻辑与系统服务,提高代码的可复用性...

    spring-boot添加 拦截器

    在Spring MVC框架中,拦截器是基于AOP(面向切面编程)的概念实现的。我们可以通过实现`HandlerInterceptor`接口或继承`AbstractHandlerMethodInterceptor`抽象类来自定义拦截器。最常见的方法是实现`...

    Spring-MVC-aop.zip

    下面是一个简单的日志拦截器示例: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.controller.*.*(..))") public void logBefore(JoinPoint joinPoint) { String...

    spring MVC(新增拦截器demo)

    通过学习这个“spring MVC(新增拦截器demo)”项目,你不仅能够理解Spring MVC拦截器的基本使用,还能掌握如何将拦截器应用于实际的需求场景。拦截器的灵活运用可以大大提高代码的复用性和维护性,使得Spring MVC应用...

    一个简单的Spring-MVC例子.docx

    在Spring中,方面可以通过Advisor或拦截器来实现。 2. **连接点(Joinpoint)**:程序执行流程中的特定点,如方法的调用或异常的抛出。Spring允许在这些点插入通知。 3. **通知(Advice)**:在特定连接点上执行的...

    Spring MVC--拦截器实现和用户登陆例子

    Spring MVC拦截器实现和用户登陆例子 Spring MVC框架中,拦截器是一种非常重要的机制,能够在请求处理的不同阶段进行拦截和处理。下面,我们将详细介绍Spring MVC拦截器的实现和用户登陆例子。 一、拦截器的实现 ...

    spring boot 登录拦截器

    在Spring Boot应用中,登录拦截器是一个至关重要的组件,它用于保护特定的Web资源,确保只有经过身份验证的用户才能访问。Spring Boot结合了Spring MVC框架,提供了方便的方式来实现这样的拦截器。本篇文章将深入...

    wa-spring1-SpringProject.zip_spring mvc 例子

    标题中的"wa-spring1-SpringProject.zip_spring mvc 例子"表明这是一个关于Spring MVC框架的实际应用示例项目。Spring MVC是Spring框架的一个模块,主要用于构建Web应用程序,它提供了模型-视图-控制器(MVC)架构...

    spring拦截器的简单例子

    在这个简单的例子中,我们将探讨如何在 Spring 中配置和使用拦截器。 首先,我们需要创建一个自定义的拦截器类,该类需要实现 `HandlerInterceptor` 接口。这个接口提供了三个方法:`preHandle()`、`postHandle()` ...

    SpringMVC拦截器例子详解

    下面将详细解释Spring MVC拦截器的工作原理、配置和实际应用。 1. **工作原理**: - 拦截器是基于AOP(面向切面编程)思想实现的,它通过预处理器和后处理器模式,对HTTP请求进行拦截。 - 当一个请求到达Spring ...

Global site tag (gtag.js) - Google Analytics