`

使用拦截器

 
阅读更多
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()方法。
分享到:
评论

相关推荐

    axios使用拦截器统一处理所有的http请求的方法

    如果想要为特定的axios实例添加拦截器,可以在创建axios实例后,对这个实例使用拦截器。 ``` var instance = axios.create({ baseURL: '***', timeout: 5000 }); instance.interceptors.request.use(function...

    使用拦截器解决中文乱码

    ### 使用拦截器解决中文乱码 #### 背景与问题描述 在Web开发中,中文乱码是一个常见的问题,特别是在使用不同的编码格式时。在Struts框架中(包括Struts1和Struts2),这一问题尤为突出。Struts1通常通过在`web....

    axios使用拦截器统一处理所有的http请求的方法.docx

    下面是一个使用 Axios 拦截器的示例代码: ``` import axios from 'axios'; import store from '../../store'; const service = axios.create({ baseURL: 'https://test.api.rujiaowang.net', timeout: 5000 }); ...

    mybatis使用拦截器实现分页操作

    4. **使用拦截器**:现在,当执行包含分页参数的Mapper方法时,拦截器会自动处理分页逻辑,无需在每个查询方法中重复编写分页代码。 除了上述基本的实现方式,还可以考虑结合MyBatis的`ExecutorType.SIMPLE`或`...

    企业级开发-SpringMVC使用拦截器实现用户登录权限验证实验报告.docx

    - 如何配置 SpringMVC 框架以使用自定义拦截器。 - 如何在 Web 应用的部署描述符(`web.xml`)中配置 DispatcherServlet。 这些知识是构建企业级应用的基础,对于理解 SpringMVC 框架的工作原理和提高安全性至关...

    使用拦截器进行权限控制.rar

    本教程以“使用拦截器进行权限控制”为主题,旨在帮助新手掌握如何在Struts2框架下实现权限控制。 首先,让我们了解什么是拦截器。在Struts2中,拦截器是基于Java的动态代理实现的,它通过调用一系列拦截器来形成一...

    在struts1中使用拦截器——saif-0.1.jar

    本文将深入探讨在Struts1中如何使用拦截器,并以saif-0.1.jar为例,解释其在实际项目中的应用。 首先,理解Struts1拦截器的概念。拦截器是基于Java的动态代理机制实现的,它们按照预定义的顺序对请求进行拦截,执行...

    使用拦截器解决中文乱码问题.pdf

    本文将详细讲解如何使用拦截器(Interceptor)来有效解决Struts2中的中文乱码问题。 首先,我们需要了解为什么在Struts2中直接使用Filter无法解决乱码。在Struts1中,我们通常会自定义一个Filter,设置字符编码,...

    使用拦截器解决中文乱码问题.docx

    本文将详细介绍如何使用Struts2的拦截器(Interceptor)来解决中文乱码问题。 首先,我们要理解Struts2的拦截器工作原理。Struts2的拦截器是基于拦截器栈(Interceptor Stack)的概念,它允许开发者在Action执行...

    axios封装,使用拦截器统一处理接口,超详细的教程(推荐).docx

    "axios封装,使用拦截器统一处理接口,超详细的教程" 本文档主要介绍了如何使用axios库来封装接口,使用拦截器统一处理接口的方法。首先,作者创建了一个axios文件夹,在文件夹中新建了aps.js和request.js文件。aps...

    struts2拦截器实现权限控制

    3. 配置拦截器栈:Struts2使用拦截器栈的概念,即将多个拦截器组织成一个栈,按照栈的顺序依次执行。在`struts.xml`中,可以创建一个或多个拦截器栈,并将权限拦截器包含在内。 4. 应用拦截器:在Action配置中,...

    在struts2中使用拦截器(Interceptor)控制登录和权限[汇编].pdf

    在本文中,我们将深入探讨如何在Struts2中使用拦截器来控制登录和权限管理。 首先,让我们了解Interceptor的基本结构。在给出的`LoginInterceptor.java`代码中,可以看到拦截器是继承自`AbstractInterceptor`的。`...

    自定义拦截器的实现以及拦截器的详细配置

    在Java Web开发中,拦截器(Interceptor)是一个重要的概念,特别是在使用MVC框架如Struts2时。拦截器可以理解为一种预处理和后处理机制,它在请求到达控制器之前和离开控制器之后进行操作,例如日志记录、权限检查...

    CXF WebService带有拦截器

    本篇文章将深入探讨如何使用CXF来开发具有权限控制功能的Web Service,并通过拦截器实现这一目标。 首先,我们需要理解Web Service拦截器的概念。在CXF中,拦截器是处理消息生命周期中的关键组件,它们可以在消息...

    MyBatis拦截器:给参数对象属性赋值的实例

    `OpeInfoInterceptor`类就是这样一个拦截器,它使用了`@Intercepts`注解来指定拦截的目标。`@Signature`注解用来精确定义拦截的方法,这里是`Executor`类的`update`方法,接收`MappedStatement`和`Object`两个参数。...

    拦截器和过滤器的区别

    - **独立性较高**:拦截器并不依赖于Servlet容器,因此可以在任何环境中使用拦截器技术来实现类似的功能。 - **适用范围广**:除了传统的Web应用外,拦截器还可以应用于各种基于Java的框架或库中。 - **过滤器**...

    拦截器解决中文乱码问题

    "拦截器解决中文乱码问题"这个主题,主要关注的是如何通过使用拦截器(Interceptor)这一技术手段来预防或解决乱码现象。拦截器是Spring MVC框架中的一个重要组件,它可以对HTTP请求进行预处理和后处理,从而在数据...

    SpringBoot的拦截器

    Spring Boot提供了对Spring MVC的集成,因此我们可以利用Spring MVC的拦截器机制来实现这些功能。 首先,让我们了解一下Spring Boot中创建拦截器的基本步骤: 1. 创建自定义拦截器类:你需要创建一个实现了`...

    springMVC拦截器项目

    在这个项目中,你可以了解到如何配置和使用拦截器,以及如何将它们集成到 SpringMVC 应用中。 1. **SpringMVC 概述**: SpringMVC 提供了一个模型-视图-控制器架构,用于处理 HTTP 请求和响应。它简化了 MVC 应用...

Global site tag (gtag.js) - Google Analytics