`
nannan408
  • 浏览: 1771179 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

spring 自定义拦截器

 
阅读更多
  1.前言.  
本文转自:http://blog.csdn.net/tjcyjd/article/details/7498236
  2.内容。 
    经过一天的奋战,终于会使用了SpringMVC,下面讲下他的拦截器。使用SpringMVC拦截器和Struts2一样,Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口。完整的例子可以到我的资源下载:http://download.csdn.net/download/tjcyjd/4255319
HandlerInterceptor接口的代码如下:


[java] view plaincopyprint?
01.package org.springframework.web.servlet;   
02.import Javax.servlet.http.HttpServletRequest;  
03.import Javax.servlet.http.HttpServletResponse;  
04.public interface HandlerInterceptor {   
05.     // preHandle()方法在业务处理器处理请求之前被调用   
06.     boolean preHandle(HttpServletRequest request,  
07.HttpServletResponse response,   
08.     Object handler)  
09.         throws Exception;   
10.     // postHandle()方法在业务处理器处理请求之后被调用   
11.     void postHandle(   
12.             HttpServletRequest request, HttpServletResponse  
13.response, Object   
14.             handler, ModelAndView modelAndView)  
15.             throws Exception;   
16.     // afterCompletion()方法在DispatcherServlet完全处理完请求后被调用   
17.     void afterCompletion(   
18.             HttpServletRequest request, HttpServletResponse 
19.response, Object   
20.             handler, Exception ex)  
21.             throws Exception;   
22.  
23. }  
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,代码如下:


[sql] view plaincopyprint?
01.package com.yjde.web.interceptor; 
02. 
03.import java.util.Calendar; 
04. 
05.import javax.servlet.http.HttpServletRequest; 
06.import javax.servlet.http.HttpServletResponse; 
07. 
08.import org.springframework.web.servlet.ModelAndView; 
09.import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 
10. 
11.public class TimeInterceptor extends HandlerInterceptorAdapter { 
12.    // 继承HandlerInterceptorAdapter类 
13. 
14.    private int openingTime; // openingTime 属性指定上班时间 
15.    private int closingTime; // closingTime属性指定下班时间 
16.    private String outsideOfficeHoursPage;// outsideOfficeHoursPage属性指定错误提示页面的URL 
17. 
18.    // 重写 preHandle()方法,在业务处理器处理请求之前对该请求进行拦截处理 
19.    public boolean preHandle(HttpServletRequest request, 
20.            HttpServletResponse response, Object handler) throws Exception { 
21.        Calendar cal = Calendar.getInstance(); 
22.        int hour = cal.get(Calendar.HOUR_OF_DAY); // 获取当前时间 
23.        if (openingTime <= hour && hour < closingTime) { // 判断当前是否处于工作时间段内 
24.            return true; 
25.        } else { 
26.            response.sendRedirect(outsideOfficeHoursPage); // 返回提示页面 
27.            return false; 
28.        } 
29.    } 
30. 
31.    public void postHandle(HttpServletRequest request, 
32.            HttpServletResponse response, Object o, ModelAndView mav) 
33.            throws Exception { 
34.        System.out.println("postHandle"); 
35.    } 
36. 
37.    public void afterCompletion(HttpServletRequest request, 
38.            HttpServletResponse response, Object o, Exception excptn) 
39.            throws Exception { 
40.        System.out.println("afterCompletion"); 
41.    } 
42. 
43.    public int getOpeningTime() { 
44.        return openingTime; 
45.    } 
46. 
47.    public void setOpeningTime(int openingTime) { 
48.        this.openingTime = openingTime; 
49.    } 
50. 
51.    public int getClosingTime() { 
52.        return closingTime; 
53.    } 
54. 
55.    public void setClosingTime(int closingTime) { 
56.        this.closingTime = closingTime; 
57.    } 
58. 
59.    public String getOutsideOfficeHoursPage() { 
60.        return outsideOfficeHoursPage; 
61.    } 
62. 
63.    public void setOutsideOfficeHoursPage(String outsideOfficeHoursPage) { 
64.        this.outsideOfficeHoursPage = outsideOfficeHoursPage; 
65.    } 
66. 
67.} 
68.// 可以看出,上面的代码重载了preHandle()方法,该方法在业务处理器处理请求之前被调用。在该方法中,首先获得当前的时间,判断其是否在 
69.// openingTime和closingTime之间,如果在,返回true,这样才会调用业务控制器去处理该请求;否则直接转向一个页面,返回false,这样该请求就不会被处理。 
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,这样该请求就不会被处理。


可以看出,上面的代码重载了preHandle()方法,该方法在业务处理器处理请求之前被调用。在该方法中,首先获得当前的时间,判断其是否在 openingTime和closingTime之间,如果在,返回true,这样才会调用业务控制器去处理该请求;否则直接转向一个页面,返回 false,这样该请求就不会被处理。

下面是在dispatcher-servlet.xml中对拦截器进行的配置,代码如下:


[java] view plaincopyprint?
01.<PRE class=html name="code"><?xml version="1.0" encoding="UTF-8"?> 
02.<beans xmlns="http://www.springframework.org/schema/beans" 
03.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" 
04.    xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" 
05.    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 
06.    xsi:schemaLocation="http://www.springframework.org/schema/beans  
07.            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
08.            http://www.springframework.org/schema/context   
09.            http://www.springframework.org/schema/context/spring-context-3.0.xsd  
10.            http://www.springframework.org/schema/aop   
11.            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
12.            http://www.springframework.org/schema/tx   
13.            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
14.            http://www.springframework.org/schema/mvc   
15.            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
16.            http://www.springframework.org/schema/context   
17.            http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
18.    <!-- 
19.        使Spring支持自动检测组件,如注解的Controller 
20.    --> 
21.    <context:component-scan base-package="com.yjde.web.controller" /> 
22. 
23.    <bean id="viewResolver" 
24.        class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
25.        p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> 
26.    <mvc:interceptors> 
27.        <mvc:interceptor> 
28.            <!--设置拦截的路径--> 
29.            <mvc:mapping path="/login1.htm" /> 
30.            <mvc:mapping path="/login2.htm" /> 
31.            <bean class="com.yjde.web.interceptor.TimeInterceptor"> 
32.                <!--openingTime 属性指定上班时间--> 
33.                <property name="openingTime"> 
34.                    <value>12</value> 
35.                </property> 
36.                <!--closingTime属性指定下班时间--> 
37.                <property name="closingTime"> 
38.                    <value>14</value> 
39.                </property> 
40.                <!--outsideOfficeHoursPage属性指定提示页面的URL--> 
41.                <property name="outsideOfficeHoursPage"> 
42.                    <value>http://localhost:8080/SpringMVCInterceptor/jsp/outsideOfficeHours.jsp  
43.                    </value> 
44.                </property> 
45.            </bean> 
46.        </mvc:interceptor> 
47.    </mvc:interceptors> 
48.    <bean id="messageSource" 
49.        class="org.springframework.context.support.ResourceBundleMessageSource" 
50.        p:basename="message"> 
51.    </bean> 
52.</beans></PRE><BR> 
53.<BR> 
54.<PRE></PRE> 
55.<P></P> 
56.<PRE></PRE> 
57.<P></P> 
58.<P style="BACKGROUND: white" align=left><SPAN style="COLOR: #555555">可以看出,上面代码用bean</SPAN>标签去定义TimeInterceptor,令其id为officeHoursInterceptor,并给它的3个 属性赋值。具体的大家可以运行一下项目看看。</P> 
59.<P style="BACKGROUND: white" align=left><SPAN style="COLOR: #555555"> </SPAN></P> 
60.<P style="BACKGROUND: white" align=left><SPAN style="COLOR: #555555">说 明:控制反转是Spring</SPAN>框架的核心思想,即用一个接口去定义一些操作,在接口的实现类中去重写这些操作,然后在Spring的配置 文件中去把该接口的实现类注入到应有框架中,这样就可以通过调用接口去调用接口的实现类。此次讲的拦截器就体现了这种思想,即实现 HandlerInterceptorAdapter接口,重写preHandle()方法并在配置文件中实现TimeInterceptor的注入。这 
61. 样当框架调用HandlerInterceptorAdapter时,就可以调用到TimeInterceptor类的preHandle()方法。</P> 
62.<P style="BACKGROUND: white" align=left></P> 
63.<H4><A name=t1></A><SPAN style="FONT-FAMILY: KaiTi_GB2312; FONT-SIZE: 16px"><SPAN style="BACKGROUND-COLOR: white">完整的例子可以到我的资源下载:<A href="http://download.csdn.net/download/tjcyjd/4255319">http://download.csdn.net/download/tjcyjd/4255319</A></SPAN></SPAN></H4> 
64.<P></P> 
65.<P style="BACKGROUND: white" align=left><BR> 
66.</P> 
67.<P> </P> 
分享到:
评论

相关推荐

    CXF3.0+Spring3.2 自定义拦截器

    3. **Spring集成**:在Spring3.2中,我们可以使用`&lt;cxf:bus&gt;`和`&lt;cxf:interceptor&gt;`标签将自定义拦截器注册到CXF Bus中。这样,Spring容器会管理拦截器的生命周期,并在需要时注入其他依赖。 4. **拦截器链**:CXF...

    Spring MVC--13.自定义拦截器

    Spring MVC--自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器

    spring集成cxf客户端和服务器端demo(含自定义拦截器)

    在本项目中,"spring集成cxf客户端和服务器端demo(含自定义拦截器)"是一个实战案例,展示了如何在Spring框架下与Apache CXF服务进行整合,实现客户端和服务端的交互,并利用拦截器来增强功能。以下是这个项目涉及的...

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

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

    SpringBoot中自定义拦截器示例代码

    本篇将详细讲解如何在Spring Boot中创建并使用自定义拦截器,并提供相关的示例代码。 首先,我们需要了解Spring MVC中的拦截器(HandlerInterceptor)接口。该接口定义了三个方法: 1. `preHandle...

    SpringMvc自定义拦截器(注解)代码实例

    首先,自定义拦截器需要实现Spring MVC提供的`HandlerInterceptor`接口。这个接口定义了三个关键方法: 1. `preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)`: 这是在请求被...

    CXF+Spring+自定义拦截器 WebService实例源码下载

    这里少了一个类,是根据实体类生成xml的文件下载地址为:http://download.csdn.net/detail/qq_14996421/9495688

    SpringBoot 自定义拦截器 的 源代码

    SpringBoot 自定义拦截器 的 源代码 SpringBoot 自定义拦截器 一、自定义拦截器 二、编写控制器 三、添加拦截器对象,注入到容器的配置类中 另一种写法 四、最后application运行 我们对拦截器并不陌生,无论是 ...

    SpringBoot的拦截器

    1. 创建自定义拦截器类:你需要创建一个实现了`HandlerInterceptor`接口的类,这个接口包含三个方法:`preHandle()`, `postHandle()`, 和 `afterCompletion()`。这些方法会在请求生命周期的不同阶段被调用。 ```...

    CXF+Spring+自定义拦截器 webservice源码下载

    CXF+Spring+自定义拦截器 webservice源码下载

    自己spring boot 拦截器

    自定义拦截器可以帮助我们更好地控制应用程序的行为,满足特定业务需求。 创建自己的Spring Boot拦截器首先需要实现`HandlerInterceptor`接口或者继承`AbstractHandlerMethodInterceptor`抽象类。这个接口定义了三...

    实现java自定义注解拦截器.docx

    以上步骤展示了如何使用Spring Boot中的自定义拦截器和自定义注解来实现对特定方法的选择性拦截。这种机制可以非常灵活地控制哪些请求需要经过额外的验证或处理,对于构建安全可控的应用程序来说非常重要。

    CXF3.1.16 +Spring4 +MyBatis + Maven自定义拦截器 WebService实例源码下载

    "CXF3.1.16 +Spring4 +MyBatis + Maven自定义拦截器 WebService实例源码下载" 这个标题揭示了该项目的核心技术栈,包括: 1. CXF 3.1.16:这是一个开源的服务框架,用于构建和开发服务,支持SOAP和RESTful Web服务...

    SSM笔记-SpringMVC的自定义拦截器

    自定义拦截器允许开发者根据业务需求进行更精细的控制,例如权限验证、日志记录、性能统计等。下面我们将深入探讨SpringMVC自定义拦截器的实现过程和应用场景。 首先,自定义拦截器需要实现`HandlerInterceptor`...

    spring-boot 自定义xml配置web请求拦截器

    这涉及到Spring Boot的Web层架构、AOP(面向切面编程)以及自定义拦截器的概念。Spring Boot简化了传统Spring应用的配置,但仍然允许用户通过XML配置来扩展功能,特别是在某些特定场景下,如集成第三方库或定制化...

    Spring AOP 拦截器 Advisor

    Spring AOP 拦截器 Advisor 是 Spring 框架中的一个重要概念,它与切面编程密切相关,用于实现细粒度的控制和增强应用程序的行为。在 Spring AOP 中,Advisor 是一个组合了通知(Advice)和切入点(Pointcut)的对象...

    struts2整合spring实现拦截器

    我们可以通过自定义拦截器来实现特定的功能,比如权限验证、日志记录等。在Struts2的配置文件中,我们可以注册这个拦截器: ```xml ``` 然后在Action类上声明需要使用的拦截器: ```xml ...

    spring boot 登录拦截器

    在这个例子中,`YourLoginInterceptor`是你自定义的登录拦截器类,`addPathPatterns`指定了需要拦截的URL模式,而`excludePathPatterns`则排除了不需要拦截的URL。 总结起来,Spring Boot结合JPA提供了强大的数据库...

    Spring MVC 拦截器

    自定义拦截器通常需要继承`HandlerInterceptorAdapter`并覆盖其方法。例如,`ControllerInterceptor`类实现了基本的拦截逻辑: ```java public class ControllerInterceptor extends HandlerInterceptorAdapter { ...

    自定义拦截器与Ation传递复杂对象到Request源码

    在本文中,我们将深入探讨如何自定义拦截器以及如何通过Action在Request中传递复杂对象。 首先,自定义拦截器的步骤主要包括以下几个方面: 1. 创建拦截器类:你需要创建一个实现了特定框架提供的拦截器接口的类。...

Global site tag (gtag.js) - Google Analytics