在开发一个网站时可能有这样的需求:某些页面只希望几个特定的用户浏览。对于这样的访问权限控制,应该如何实现呢?拦截器就可以实现上述需求。在 Struts 2 框架中,拦截器是其重要的组成部分,Spring MVC 框架也提供了拦截器功能。

Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。

拦截器的定义

在 Spring MVC 框架中定义一个拦截器需要对拦截器进行定义和配置,定义一个拦截器可以通过两种方式:一种是通过实现 HandlerInterceptor 接口或继承 HandlerInterceptor 接口的实现类来定义;另一种是通过实现 WebRequestInterceptor 接口或继承 WebRequestInterceptor 接口的实现类来定义。

本节以实现 HandlerInterceptor 接口的定义方式为例讲解自定义拦截器的使用方法。示例代码如下:

package interceptor;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

public class TestInterceptor implements HandlerInterceptor {

@Override

public void afterCompletion(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception ex)

throws Exception {

System.out.println("afterCompletion方法在控制器的处理请求方法执行完成后执行,即视图渲染结束之后执行");

}

@Override

public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

System.out.println("postHandle方法在控制器的处理请求方法调用之后,解析视图之前执行");

}

@Override

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler) throws Exception {

System.out.println("preHandle方法在控制器的处理请求方法调用之后,解析视图之前执行");

return false;

}

}

在上述拦截器的定义中实现了 HandlerInterceptor 接口,并实现了接口中的 3 个方法。有关这 3 个方法的描述如下。

preHandle 方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。

postHandle 方法:该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。

afterCompletion 方法:该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。

拦截器的配置

让自定义的拦截器生效需要在 Spring MVC 的配置文件中进行配置,配置示例代码如下:

在上述示例代码中, 元素用于配置一组拦截器,其子元素 定义的是全局拦截器,即拦截所有的请求。

元素中定义的是指定路径的拦截器,其子元素 用于配置拦截器作用的路径,该路径在其属性 path 中定义。

如上述示例代码中,path 的属性值“/**”表示拦截所有路径,“/gotoTest”表示拦截所有以“/gotoTest”结尾的路径。如果在请求路径中包含不需要拦截的内容,可以通过 子元素进行配置。

需要注意的是, 元素的子元素必须按照 、、 的顺序配置。

java spring 拦截器_Spring MVC拦截器(Interceptor)的配置及使用相关推荐

  1. spring mvc拦截器_Spring MVC拦截器示例

    spring mvc拦截器 我认为现在是时候看看Spring的MVC拦截器机制了,这种机制已经存在了很多年,并且是一个非常有用的工具. Spring Interceptor会按照提示说:在传入的HTT ...

  2. Java web登录拦截器_Spring MVC 拦截器实现登录

    上篇博文我在博客中讲到如何使用spring MVC框架来实现文件的上传和下载,今天小钱给大家再来分享和介绍Spring MVC框架中相当重要的一块功能--拦截器. 关于拦截器的概念我在这里就不多说了, ...

  3. springmvc 拦截器_Spring MVC拦截器学习

    1 介绍 Spring Web MVC是基于Servlet API构建的原始Web框架. 2 拦截器 2.1 定义 springmvc框架的一种拦截机制 2.2 使用 2.2.1 两步走 实现Hand ...

  4. spring 两次进入拦截器_spring mvc 拦截器一次请求拦截两次?

    问题描述 对于Spring mvc的拦截器我觉的应该是请求什么就该拦截什么,没有请求的就不该被拦截,但是不知道为什么,在如下的代码中,当我请求/路径的时候,我并没有请求index.html呀,为什么执 ...

  5. java spring包_java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式...

    java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式 发布时间:2018-08-20 12:02, 浏览次数:774 , 标签: java spri ...

  6. java spring redis订阅_spring中订阅redis键值过期消息通知

    1.首先启用redis通知功能(ubuntu下操作): 编辑/etc/redis/redis.conf文件,添加或启用以下内容(过期通知): notify-keyspace-events Ex 或者登 ...

  7. java spring 事务传播_spring事务传播机制实例讲解

    天温习spring的事务处理机制,总结如下 对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011 spri ...

  8. java 异步处理数据格式_spring mvc对异步请求的处理

    在spring mvc3.2及以上版本增加了对请求的异步处理,是在servlet3的基础上进行封装的. 1.修改web.xml <?xml version="1.0" enc ...

  9. java spring 是什么_Spring详解(一)------概述

    本系列教程我们将对 Spring 进行详解的介绍,相信你在看完后一定能够有所收获. 1.什么是 Spring ? Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开 ...

最新文章

  1. 集成学习--百面机器学习
  2. 在Python源中使用UTF-8编码[重复]
  3. 【翻译自mos文章】OGG replicat 进程使用的 TCP port
  4. my.ini修改后服务无法启动_VisualSVN Server 自助修改密码页面
  5. Delphi XE5 for Android (十一)
  6. 前端微信签名验证工具_微信小程序API 用户数据的签名验证和加解密
  7. C++设计模式-单例模式(双重锁定)
  8. kgtp linux内核调试
  9. Android 布局管理器 之 TableLayout
  10. ssis 列转换_SSIS组播转换概述
  11. Jsoup爬虫新手一
  12. 内存测试软件 ddr 4,DDR4内存理论性能测试
  13. java的显示图片的控件_调用java在图像控件中显示网络图片
  14. python计算圆锥体积和表面积_圆锥体积公式和表面积
  15. git 上上下下左左右右AABB
  16. 从入门到实战,一文带你彻底读懂Vue3.0
  17. 网络安全基础(十二)
  18. 关于绝地求生某辅助白名单画中画逆向分析
  19. 什么是 PCIe 卡?您需要了解的有关PCI Express卡的所有信息
  20. Android6.0动态权限申请及RxPermissions权限库使用

热门文章

  1. 微软也加入FB开放计算项目 发布交换机操作系统
  2. php 错误日志 redis' already loaded in Unknown on line 0
  3. ArcGIS 10.7拆分多部件要素(Multipart Features)至单部件要素的两种方法
  4. 【计算机图形学】实验:VB.net环境下的绘制贝赛尔(Bezier)自由曲线完整实验操作步骤
  5. 平面坐标(方里网)转换为经纬度坐标
  6. Android之android.os.NetworkOnMainThreadException异常
  7. Android插件化开发基础之静态代理模式
  8. 四、WebApp 基础可视组件(IVX 快速开发教程)
  9. python typeerror* wants int_python-TypeError:’int’对象是不可迭代的?
  10. java 获取接口的注解_java反射注解妙用-获取所有接口说明