`
Josh_Persistence
  • 浏览: 1633524 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

Spring3.X @MVC - (三)Spring3中的拦截器

阅读更多

前言:

一、总共有10节,也就是10篇博客来讲述Spring的MVC,几乎涵盖了所有Spring MVC中的内容。

 

二、我创建的例子是一个球场预订系统,例子我已经测试调试通过,是一个Maven的project,包含一个Parent project:wsheng-spring-base和一个子Module:wsheng-spring-mvc.

 

三、在Eclipse中直接import maven的project即可,会同时引入上诉两个project的。

 

四、如果你没有耐心,可以不必往下学习,因为网上有很多例子,但是都是讲的Spring MVC很少的面,而且你可以快速的上手,但如果你想真正了解Spring MVC中的很多细节,就可以慢慢的去看博客(从第一节到第十节),如果有什么问题,欢迎信息告诉我。

 

五、学习的方法是你可以先将源码导入到eclipse中,然后根据博客上的内容,对照源码,慢慢消化,这是个漫长的过程,但是会帮助你了解很多Spring MVC的细节。

===================================================================================

 

 

用Spring处理程序拦截器拦截请求

在Spring3.X @MVC - (二)So Easy的注解功能的学习基础上

http://josh-persistence.iteye.com/admin/blogs/1873733 接着学习Spring拦截器功能。

学过Java Web编程的开发人员都知道,Servlet API中有Servlet过滤器,该过滤器可以可以在Servlet进行Web请求先后进行相关的处理。其实Spring中也可以实现类似而且更加强大的功能。可以在Spring Web上下文中配置和过滤器相似的功能部件,这样就可以使用Spring强大的容器特性。

 

SpringMVC中可以使用拦截器(Handler Interceptors)拦截web请求进行预先和事后的处理。每个程序拦截器都必须实现HandlerInterceptor接口,实现该接口必须实现3个方法:preHandler(), postHandle(),afterCompletion()

preHandle(): 处理Request之前执行。

postHandler():处理Request方法之后但是还没有返回View之前执行,并允许处理ModelAndView对象。

afterCompletion():在所有请求处理完成之后(也就是显示视图之后)调用。

 

实战和原理:

需求: 测试每个Web请求的处理时间,并由视图将这个时间显示给用户。

package com.wsheng.spring.web;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

 

/**

 * 

 * @author Wang Sheng(Josh)

 *

 */

public class MeasurementInterceptor extends HandlerInterceptorAdapter {

 

    public boolean preHandle(HttpServletRequest request,

            HttpServletResponse response, Object handler) throws Exception {

        long startTime = System.currentTimeMillis();

        request.setAttribute("startTime", startTime);

        return true;

    }

 

    public void postHandle(HttpServletRequest request,

            HttpServletResponse response, Object handler,

  //Model model) throws Exception {

  ModelAndView modelAndView) throws Exception {

        long startTime = (Long) request.getAttribute("startTime");

        request.removeAttribute("startTime");

        long endTime = System.currentTimeMillis();

        //model.addAttribute("handlingTime", endTime - startTime);

        System.out.println("handlingTime:" + (endTime - startTime));

        modelAndView.addObject("handlingTime", endTime - startTime);

    }

 

}

 

你可能会注意到,这个地方MeasurementInterceptor继承了HandlerInterceptorAdapter,而不是实现了HandlerInterceptor接口,这是因为这个地方如果实现了HandlerInterceptor接口,那么就需要实现该接口中的所有方法,而这个地方我们只是简单的记录一下处理Request的时间,是不需要重写afterCompletion()方法的,最简单的方法是让在程序中让该方法体为空。还有另一种更好的方法是继承抽象类HandlerInterceptorAdapter ,实际上HandlerInterceptorAdpater是实现了HandlerInterceptor接口的,并重写了preHandle(), postHandle()和AfterCompletion()方法,而且这些方法都是具体的public方法,只不过preHandle()方法是返回true,postHandle()和afterCompletion()是空实现。所以用户在继承HandlerInterceptorAdapter后,可以根据自己的需要去进行重写。

 

接着需要将自定义的拦截器注册到DefaultAnnotationHandlerMapping bean中。这个bean的作用是将拦截器应用到所有以@Controller注解标注的类,意思是说所有的控制器都要受到拦截器的控制。(可以在数组类型的interceptors属性中指定多个拦截器)

<!-- Annotation handlers (Applied by default to ALL @controllers -->

    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">

        <property name="order" value="1"/>

        <!-- Interceptors are applied to all annotated controllers -->

         <property name="interceptors">

            <list>

                <ref bean="measurementInterceptor" />

            </list>

        </property>

    </bean>

 

然后可以在welcome.jsp中显示这个页面:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

 

<html>

<head>

<title><spring:message code="welcome.title" text="Welcome" /></title>

</head>

 

<body>

<h2><spring:message code="welcome.message" text="Welcome to Court Reservation System" /></h2>

 

Today is <fmt:formatDate value="${today}" pattern="yyyy-MM-dd" />.

<hr />

Handling time : ${handlingTime} ms

<br />

Locale : ${pageContext.response.locale}

</body>

</html>

 

DefaultAnnoationHandlerMapping的缺点:

如上所述,DefaultAnnoationHandlerMapping会将其中定义的所有的拦截器分配给所有的@Controller注解定义的类,如果想将不同的拦截器应用于不同的@Controller控制器上DefaultAnnoationHandlerMapping显然不能完成。幸运的是这是一个常见的需求,所以Scott Murphy的Spring-plugins项目就可以完成该功能,该项目允许你使用URL在控制器的基础上应用拦截器。

你可以在http://code.goole.com/p/springplugins/downloads/list中下载该项目,并将相关的jar配置到maven-repository中,但是很不幸的是,截止我发布这篇博客的时候,springplugins.jar还是没有在maven官方的repository中,最简单的方法是将其jar放在应用的WEB-INF/lib中,但是这个显然忽视了Maven强大的功能,比较好的解决办法是将其加到本地的maven repository中。可参照我的另一篇博客:

http://josh-persistence.iteye.com/admin/blogs/1874906

将jar包加到项目中后,接下来只需要配置一个springplugin中称作SelectedAnnotationHandlerMapping的一个类,并且将其配置和DefaultAnnoationHandlerMapping bean的配置放在一起就可以了。如:

<!-- Interceptors --> 

    <bean id="measurementInterceptor"

        class="com.wsheng.spring.web.MeasurementInterceptor" />

 

 

   <bean id="summaryReportInterceptor"

        class="com.wsheng.spring.web.ExtensionInterceptor" />

 

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">

        <property name="order" value="1"/>

        <!-- Interceptors are applied to all annotated controllers -->

         <property name="interceptors">

            <list>

                <ref bean="measurementInterceptor" />

            </list>

        </property>

    </bean>

 

    <bean id="publicMapper" class="org.springplugins.web.SelectedAnnotationHandlerMapping">

        <property name="order" value="0" />

<property name="urls">

<list>

             <value>/reservationSummary*</value>

</list>

</property>

<property name="interceptors">

<list>

         <ref bean="summaryReportInterceptor" />

</list>

</property>

    </bean>

上面的配置会产生如下的效果:measurementInterceptor拦截器应用到所有以@Controller注解的控制器,而summaryReportInterceptor拦截器只用到用@Controller注解的,映射到/reservationSummary*URL的那些控制器。order值越小的,处理优先级越高。order值越大的,处理优先级越低。为处理程序拦截器分配order值的过程与当初在web.xml中分配给servlet的启动时加载的属性类似。

分享到:
评论

相关推荐

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

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

    Spring MVC--9.自定义拦截器、异常处理

    Spring MVC--9.自定义拦截器、异常处理

    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:...

    SpringMVCDemo:Spring MVC 框架知识案例

    1.创建第一个 Spring MVC 程序案例 2.Spring MVC @RequestMapping 注解案例 3.Spring MVC 请求参数的获取案例 4.Spring MVC 域对象共享数据案例 ...14.Spring MVC 拦截器案例 15.Spring MVC 异常处理案例

    Spring MVC 拦截器

    Spring MVC 拦截器Spring MVC 拦截器

    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中文帮助文档

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

    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 Cloud OpenFeign - - - >拦截器

    初学者很容易将 Spring MVC 拦截器 和 Spring Cloud OpenFeign 拦截器搞混,误以为OpenFeign拦截器就是SpringMVC拦截器:Spring MVC拦截器发生在客户端 和 服务端之间,在客户端向服务端发送请求时进行拦截处理。...

    Spring MVC.pptx

    详细的Spring MVC教程,内容包括控制器 重定向 保存并获取属性参数 拦截器 表单标签和验证表单 视图和视图解析器 上传文件 数据转换和格式化

    Spring API

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

    spring mvc 拦截器获取请求数据信息.rar

    spring mvc 拦截器获取请求数据信息 解压之后放到项目中 直接运行就可以了 (将流多次运用)

    spring security 参考手册中文版

    12.2.3使用RequestPostProcessor在Spring MVC测试中以用户身份运行 106 作为用户在Spring MVC测试中使用注释运行 108 12.2.4测试HTTP基本认证 109 12.3 SecurityMockMvcRequestBuilders 109 12.3.1测试基于表单的...

    spring mvc拦截器过滤json中的null值

    spring mvc拦截器,过滤json数据中的null值,将null变成空字符串,内含截图,及jar包

    spring第11章--ajax,上传下载,拦截器.rar_spring mvc_spring 下载_spring 使用ajax

    spring使用ajax的方法 还有mvc的上传下载

    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....

    基于 Spring Boot +mysql的学生宿舍管理系统源代码+数据库

    系统还使用拦截器实现了登录验证和基于 RBAC 模型的权限管理。 技术栈 后端:Spring Boot、Spring MVC、MySQL、Maven、MyBatis 前端:jsp、Bootstrap、layui 修改数据库配置: 打开 src/main/resources/application-...

    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....

Global site tag (gtag.js) - Google Analytics