`
123003473
  • 浏览: 1040797 次
  • 性别: 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中一个十分重要且应用广泛的内容。这里简单敲了一个简单的例子,简单易懂

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

    本文主要介绍了Spring MVC--拦截器实现和用户登陆例子,具有很好的参考价值,下面跟着小编一起来看下吧

    spring-boot示例项目

    web|[ssh项目,spring mvc,过滤器,拦截器,监视器,thymeleaf,lombok,jquery,bootstrap,mysql](https://github.com/smltq/spring-boot-demo/blob/master/web/HELP.md) aop|[aop,正则,前置通知,后置通知,环绕通知]...

    拦截器spring mvc

    拦截器spring mvc,非常经典,非常容易理解,结合例子。官方推荐

    Spring-Reference_zh_CN(Spring中文参考手册)

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.5.3.1. RedirectView 13.5.3.2. redirect:前缀 13.5.3.3. forward:...

    Spring.3.x企业应用开发实战(完整版).part2

    15.7.2 装配拦截器 15.7.3 异常处理 15.8 小结 第5篇 测试及实战 第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2...

    spring chm文档

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.6. 本地化解析器 13.6.1. AcceptHeaderLocaleResolver 13.6.2....

    Spring3.x企业应用开发实战(完整版) part1

    15.7.2 装配拦截器 15.7.3 异常处理 15.8 小结 第5篇 测试及实战 第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2...

    Spring 2.0 开发参考手册

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.6. 本地化解析器 13.6.1. AcceptHeaderLocaleResolver 13.6.2....

    SpringMVC简单例子

    简单的springMVC认识,包含跳转,拦截器等使用

    Spring中文帮助文档

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器(ViewResolver) 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.6. 本地化解析器 13.6.1. ...

    Spring API

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器(ViewResolver) 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.6. 本地化解析器 13.6.1. ...

    java springmvc

    springmvc 例子; 使用框架:spring(包含hibernate),jquery。 ajax,文件上传,拦截器.....

    Spring MVC之DispatcherServlet_动力节点Java学院整理

    Spring MVC之DispatcherServlet 使用Spring MVC,配置DispatcherServlet是第一步。 DispatcherServlet是一个Servlet,所以可以配置多个DispatcherServlet。 DispatcherServlet是前置控制器,配置在web.xml文件中的...

    springmybatis

    mybatis实战教程mybatis in action之六与Spring MVC 的集成 mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in ...

    springMVC拦截器HandlerInterceptor用法代码示例

    主要介绍了springMVC拦截器HandlerInterceptor用法代码示例,具有一定借鉴价值,需要的朋友可以参考下

    J2EE应用开发详解

    124 8.5.3 Struts2的内置拦截器 124 8.5.4 拦截器的配置和使用 125 8.5.5 自定义拦截器 126 8.6 一个简单的Struts2应用 130 8.7 小结 140 第9章 JSF 141 9.1 JSF技术简介 141 9.1.1 JSF与MVC模式 141 9.1.2 JSF应用...

    simplejee-面向j2ee初学者的开源项目

    servlet,html,javascript,css等,以及springmvc+jdbcTemplate和 struts2+hibernate+spring, struts2+ibatis+spring 实现的登陆,CRUD,jfreechart图表显示等例子,用来演示两个mvc框架的基本使用,拦截器,验证,...

    springmvc注解

    spring mvc基于注解的简单小例子 里面有拦截器, 国际化 ajax异步请求 二维码生成 解析 多文件上传功能 但都是写在一个controller 里面 自己在jsp页面改一下请求方法名就可以 有所需要的所有jar包 下载可直接使用

Global site tag (gtag.js) - Google Analytics