我以为是时候看看Spring的MVC拦截器机制了,这种机制已经存在了很多年,并且是一个非常有用的工具。

Spring Interceptor会按照提示进行操作:在传入的HTTP请求到达您的Spring MVC控制器类之前对其进行拦截,或者相反,在其离开您的控制器之后但在将其反馈给浏览器之前,对其进行拦截。

您可能会问这对您有什么用? 答案是,它允许您执行每个请求或一组请求共有的任务,而无需将“ n”粘贴样板代码切成每个控制器类。 例如,您可以在请求到达控制器之前执行用户身份验证,如果成功,则从数据库中检索一些其他用户详细信息,然后在调用控制器之前将其添加到HttpServletRequest对象。 然后,您的控制器可以简单地检索和使用这些值,或将其留给JSP显示。 另一方面,如果身份验证失败,则可以将用户重定向到其他页面。

演示代码向您展示如何在传入的HttpServletRequest对象到达控制器之前对其进行修改。 这无非是向请求中添加一个简单的字符串,但是,正如我上面所说,您始终可以进行数据库调用来获取每个请求所需的一些数据……您甚至可以添加某种优化并进行一些处理此时进行缓存。

public class RequestInitializeInterceptor extends HandlerInterceptorAdapter {// Obtain a suitable logger.private static Log logger = LogFactory.getLog(RequestInitializeInterceptor.class);/*** In this case intercept the request BEFORE it reaches the controller*/@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {try {logger.info("Intercepting: " + request.getRequestURI());// Do some changes to the incoming request objectupdateRequest(request);return true;} catch (SystemException e) {logger.info("request update failed");return false;}}/*** The data added to the request would most likely come from a database*/private void updateRequest(HttpServletRequest request) {logger.info("Updating request object");request.setAttribute("commonData","This string is required in every request");}/** This could be any exception */private class SystemException extends RuntimeException {private static final long serialVersionUID = 1L;// Blank}
}

在上面的代码中,我通过扩展HandlerInterceptorAdaptor类(覆盖preHandle(..)方法)选择了最简单的实现方法。 我的preHandle(...)方法进行错误处理,确定发生错误时的处理方法,如果发生错误则返回false。 返回false时,拦截器链会断开,并且不会调用您的控制器类。 与请求对象混淆的实际事务被委托给updateRequest(request)。

HandlerInterceptorAdaptor类具有三个方法,每个方法都被存根,如果需要,可以忽略。 这些方法是:prehandle(…),postHandle(…)和afterCompletion(…),有关这些的更多信息可以在Spring API文档中找到 。 请注意,这可能会造成一些混乱,因为Handler Interceptor类文档仍通过它们的Spring 2处理程序名称来引用MVC控制器类。 如果您查看prehandle(…)的Object类型的第三个参数(称为处理程序),则很容易证明这一点。 如果在调试器中进行检查,您将看到它是控制器类的实例。 如果您不熟悉这项技术,请记住该控制器==处理程序。

与往常一样,实现拦截器的下一步是向Spring XML配置文件中添加一些内容:

<!-- Configures Handler Interceptors -->
<mvc:interceptors>  <!-- This bit of XML will intercept all URLs - which is what you want in a web app --><bean class="marin.interceptor.RequestInitializeInterceptor" /><!-- This bit of XML will apply certain URLs to certain interceptors --><!-- <mvc:interceptor><mvc:mapping path="/gb/shop/**"/><bean class="marin.interceptor.RequestInitializeInterceptor" /></mvc:interceptor>-->
</mvc:interceptors>

上面的XML演示了向所有请求URL添加拦截器的一种或一种选择,或者如果您查看注释掉的部分,则向特定的请求URL添加拦截器,从而允许您选择将哪些URL连接到您的拦截器类。

鹰眼的读者可能已经注意到,拦截器类使用继承和XML配置作为其实现方法。 在配置方面的常规情况下,这种模式看起来有些疲惫,并且可能需要进行大修。 一种建议是使用已添加到控制器机制中的相同技术来增强整体以使用注释。 这将增加额外的灵活性,而不会导致使用所有接口和抽象基类的复杂性。 作为建议,将来的拦截器类实现可能如下所示:

@Intercept(value = "/gb/en/*", method = RequestMethod.POST)public boolean myAuthenticationHandler(HttpServletRequest request,Model model) {// Put some code here}

这样就结束了对Spring拦截器的了解,应该记住,我只是展示了最基本的实现。

参考:来自Captain Debug博客的 JCG合作伙伴 Roger Hughes在MVC Webapp中使用Spring Interceptor 。

相关文章 :
  • jqGrid,REST,AJAX和Spring MVC集成
  • SpringMVC 3 Tiles 2.2.2集成教程
  • Spring MVC3 Hibernate CRUD示例应用程序
  • Spring MVC开发–快速教程
  • Spring,Quartz和JavaMail集成教程
  • Spring Insight – Web应用程序分析
  • Java教程和Android教程列表

翻译自: https://www.javacodegeeks.com/2011/10/spring-mvc-interceptors-example.html

Spring MVC拦截器示例相关推荐

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

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

  2. 使用session监听+spring MVC拦截器禁止用户重复登录

    在许多web项目中,需要禁止用户重复登录.一般来说有两种做法: 一是在用户表中维护一个字段isOnLine(是否在线),用户登录时,设定值为true,用户退出时设定为false,在重复登录时,检索到该 ...

  3. Spring MVC拦截器~~~登陆验证拦截

    [ 30 分 钟 轻 松 入 门 Spring MVC][web 三 大 组 件 之 ~ ~ Filter 过 滤 器] Interceptor 拦截器学习: 1.了解spring mvc拦截器的概念 ...

  4. 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor

    [Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...

  5. Java Spring MVC框架 VIII 之 Spring MVC拦截器

    Java Spring MVC框架 VIII 之 Spring MVC拦截器 Spring MVC拦截器 1.拦截器简介 拦截器是SpringMvc框架提供的功能 它可以在控制器方法运行之前或运行之后 ...

  6. spring mvc 拦截器拦截jsp页面

    spring mvc 拦截器怎么拦截jsp页面 你这个 是拦截带 /jsp 的 .do请求 解决方案 用spring 的拦截器 去拦截 所有的 .do 请求, 然后写一个 过滤器去拦截 所有的.jsp ...

  7. Spring MVC拦截器

    1.如何实现登录权限检查 使用session进行约定值的检查 实现方法: (1)使用Filter (2)使用Spring的拦截器 拦截器组件简介:Spring MVC特有组件,可以在调用Control ...

  8. Spring MVC拦截器的执行流程

    本节我们主要讲解 SpringMVC 拦截器的执行流程.分两部分介绍,首先介绍单个拦截器执行流程然后介绍多个拦截器的执行流程. 单个拦截器的执行流程 在配置文件中如果只定义了一个拦截器,程序将首先执行 ...

  9. Spring MVC拦截器(Interceptor)的配置及使用

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

最新文章

  1. python在财务领域的应用-浅谈财务智能化在实际工作中的运用
  2. makefile文件中的依赖关系理解
  3. string.h包含哪些函数_多个函数组合拳专治不规则时间转化难题|Excel134
  4. mysql之union合并查询
  5. 改成中文版的_lol手游怎么改成中文版?英雄联盟手游中文版更改教程
  6. java每个阶段的学习时间_每个Java学习者都会犯的10个最常见的1个错误
  7. 线程同步,线程不同步_同步多线程集成测试
  8. python 隐藏命令行窗口_python如何只执行cmd中的动作,但消除或隐藏cmd窗口 - 小众知识...
  9. 《Python Cookbook 3rd》笔记(5.7):读写压缩文件
  10. Ubuntu下使用Monaco字体
  11. 【Android Studio】XUI框架的使用记录:源代码Demo安装+从Demo中获取捷径快速开发自己的APP
  12. boxy 你用了吗??
  13. iOS6、7、8、9新特性总汇和适配说明
  14. 放大器的传递函数_运放全差分放大器实现单端与平衡的相互转换
  15. matlab限幅器无饱和怎么设置,抗积分饱和算法:输出限幅.ppt
  16. 计算机组成原理课程设计(很全面有保障)
  17. 算法之美——循环移位(XY→YX)逆操作
  18. 17年1月9日,小程序来了。深度解析2017微信公开课
  19. 与蓝色巨人同行,葡萄城ComponentOne将全面服务于大连IBM工作室
  20. 更新微信 7.0,你后悔了吗?

热门文章

  1. Tomcat6项目移到Tomcat7 提示 404 解决方案
  2. selenium 示例_Selenium测试中所需的功能和示例
  3. java 函数式编程 示例_功能Java示例 第8部分–更多纯函数
  4. stream分组计数_Java Stream:第2部分,计数始终是计数吗?
  5. jax-rs配置_具有MicroProfile配置的可配置JAX-RS ExceptionMapper
  6. java全局变量和局部变量_Java 10 –局部变量类型推断
  7. spring-junit4_基于Spring的应用程序-迁移到Junit 5
  8. tomee_使用Vysper,TomEE和PrimeFaces将XMPP服务器嵌入JSF Web应用程序内部
  9. jvm分配内存_为JVM分配内存:一个案例研究
  10. 对速度的需求,访问现有数据的速度提高了1000倍