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

SpringMVC自定义拦截器详解

    博客分类:
  • SSH
 
阅读更多
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完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。

下面通过一个例子来说明如何使用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()方法。
分享到:
评论

相关推荐

    SpringMVC自定义拦截器实现过程详解

    SpringMVC自定义拦截器实现过程详解 SpringMVC自定义拦截器是指在SpringMVC框架中,开发者可以自定义一些拦截器来实现特定的功能。拦截器是AOP思想的具体应用,用于对处理器进行预处理和后处理。在SpringMVC框架中...

    springmvc(自定义拦截器的使用)

    自定义拦截器是扩展Spring MVC功能、添加自定义行为的一种常见方式。以下是对自定义拦截器实现步骤的详细解释: ### 1. 自定义拦截器类 #### 1.1 继承 `HandlerInterceptorAdapter` 你可以选择继承`...

    SpringMVC拦截器例子详解

    - 自定义拦截器需要继承`HandlerInterceptor` 或 `HandlerInterceptorAdapter` 类,并重写相关方法。 - `preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)`:在请求处理之前...

    【SpringMVC】 4.3 拦截器(csdn)————程序.pdf

    《SpringMVC 拦截器详解》 在SpringMVC框架中,拦截器(Interceptor)扮演着不可或缺的角色,它允许开发者在请求被处理器处理之前和之后进行额外的操作,如日志记录、权限验证、性能统计等。拦截器机制极大地扩展了...

    SpringMVC拦截器运行原理及配置详解

    2. 在 springmvc.xml 中配置自定义拦截器 在 springmvc.xml 文件中,需要配置自定义拦截器,例如:&lt;mvc:interceptors&gt;&lt;bean class="com.example.MyInterceptor"/&gt;&lt;/mvc:interceptors&gt; 四、拦截器的应用场景 拦截...

    源代码下载 第五章 处理器拦截器详解——跟着开涛学SpringMVC

    在本章中,我们将深入探讨"处理器拦截器"在SpringMVC框架中的应用与实现,这是SpringMVC中一个至关重要的组件,它允许我们在请求处理前后执行自定义逻辑。通过学习这一主题,我们可以更好地理解SpringMVC的工作流程...

    跟开涛学SpringMVC(5)处理器拦截器详解Java开

    本教程“跟开涛学SpringMVC(5)处理器拦截器详解”深入解析了这个核心概念,帮助Java开发者提升其应用的灵活性和可维护性。 处理器拦截器在Spring MVC中的主要职责包括: 1. **预处理**:在请求到达目标控制器...

    详解SpringMVC拦截器(资源和权限管理)

    创建自定义拦截器需要继承`HandlerInterceptorAdapter`抽象类,并重写相关方法。例如: ```java public class AuthInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle...

    详解springmvc拦截器拦截静态资源

    2. **在拦截器中进行资源判断**:你可以在自定义拦截器类中添加逻辑,检查请求的URL是否属于静态资源。如果是,就直接放行。例如,可以在 `LoginInterceptor` 类中设置一个属性 `allowUrls`,包含不拦截的资源路径,...

    cas client springmvc(springmvc cas maven sso 详解 )

    **SpringMVC CAS Maven SSO详解** 在现代Web应用程序开发中,单一登录(Single Sign-On, SSO)已经成为一种常见的身份验证解决方案,它允许用户在一个系统中登录后,无需再次输入凭证即可访问其他关联系统。CAS...

    Java实训教程 Java软件开发实战 Java开发框架介绍 SpringMVC_10_拦截器 共7页.pptx

    SpringMVC提供了两种方式来实现自定义拦截器: 1. **实现HandlerInterceptor接口**:这是最常见的实现方式,用户需要实现`preHandle`、`postHandle`和`afterCompletion`三个方法。 ```java public class ...

    Springmvc拦截器执行顺序及各方法作用详解

    在实际开发中,如果需要自定义拦截器,可以通过实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter抽象类来实现。例如,一个自定义的AuthInterceptor拦截器,可以在preHandle方法中实现用户权限验证,...

    详解SpringMVC拦截器配置及使用方法

    综上所述,SpringMVC拦截器提供了一种灵活的方式来在请求处理前后添加自定义的处理逻辑,通过拦截器的配置与实现,开发者可以对Web应用进行多维度的控制和扩展。在实际开发中,根据业务需求选择合适的拦截时机和逻辑...

    ssm配置及struts文件,拦截器.zip

    最后,"struts2拦截器详解之二:深入理解struts2拦截器机制.txt"和"Struts2自定义拦截器.txt"文件详细阐述了Struts2的拦截器机制。拦截器是Struts2的核心特性之一,它们是围绕Action执行的一系列拦截动作,可以在...

    详解利用SpringMVC拦截器控制Controller返回值

    总结起来,这个示例展示了如何通过Spring MVC的拦截器和自定义注解来控制Controller方法的返回值。在开发过程中,你可以利用这个机制快速地构建和测试接口,而不需要每次都编写完整的方法实现。这种灵活性有助于提高...

    springMVC源码详解

    这些理解有助于我们定制化SpringMVC的行为,比如自定义拦截器、异常处理器等。 此外,SpringMVC中的AOP(面向切面编程)和IoC(控制反转)概念也值得深入研究。AOP用于实现如日志记录、事务管理等功能,而IoC则是...

    java springmvc

    自定义拦截器需实现`HandlerInterceptor`接口,然后在`web.xml`或Spring配置中注册。 在实际项目中,SpringMVC可以与其他技术结合,如MyBatis、RESTful API等,构建复杂的企业级应用。理解并熟练掌握SpringMVC的...

    SpringMVC 2013 内部经典教学文档 秒杀所有市面

    第五章《处理器拦截器详解》: 本章深入到SpringMVC的拦截器机制,这些拦截器可以在请求处理之前和之后执行额外的逻辑,如日志记录、权限检查等。文档可能会展示如何自定义拦截器并将其注册到SpringMVC配置中。 第...

    springmvc项目骨架

    例如,你可以定义`@Bean`方法来创建Controller实例,设置视图解析器,以及添加自定义拦截器。 - `@EnableWebMvc`注解:用于开启SpringMVC的自动配置,这使得JavaConfig成为可能。 - `WebMvcConfigurer`接口:提供...

    SpringMVC入门很简单之表单标签

    10. **拦截器(Interceptor)**:SpringMVC支持拦截器,可以在请求处理前后执行自定义逻辑,例如登录检查、日志记录等。 以上就是SpringMVC入门中的表单处理相关知识点。通过这些基础,开发者可以轻松地构建表单...

Global site tag (gtag.js) - Google Analytics