Spring MVC拦截器示例

我以为是时候看看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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 调用系统的分享[完美实现同一时候分享图片和文字]

android 系统的分享功能 private void share(String content, Uri uri){Intent shareIntent new Intent(Intent.ACTION_SEND); if(uri!null){//uri 是图片的地址shareIntent.putExtra(Intent.EXTRA_STREAM, uri);shareIntent.setType("image/*"); //当用户选择短信时…

团队行为守则—如果你们由我来领导

&#xfeff;&#xfeff;如果你是在我领导的团队里&#xff0c;有几个额外的事情我要告诉你。我深信这些行为守则是一个高效团队的润滑剂&#xff0c;我并不只是要求别人这样做&#xff0c;我自己也严格恪守。 只有三样事&#xff1a; 问&#xff1a;如果你对任务不清楚&#…

做短,但做对!

编写简洁&#xff0c;优雅&#xff0c;清晰的代码一直是开发人员的艰巨任务。 您的同事不仅会感谢您&#xff0c;而且您会惊讶地发现&#xff0c;不断期待着重构解决方案以更少的代码完成更多&#xff08;或至少相同&#xff09;的工作是多么令人兴奋。 曾经有人说好的程序员是…

math

莫比乌斯反演&#xff1a; $F(n) \sum\limits_{d|n} {f(d)} \Leftrightarrow \sum\limits_{d|n} {\mu (d)F(\frac{n}{d})} $ 其中 ${\mu (d)}$为莫比乌斯函数: 若$d$等于0 , 则${\mu (d)}$1 若$d {p_1}{p_2}{p_3}...{p_k}$ , ${p_i}$为互异质数&#xff0c;则${\mu (d)}$${( …

(笔试题)二进制1的个数相同的距离最小数

题目&#xff1a; 输入&#xff1a;整数A输出&#xff1a;整数B条件&#xff1a;A和B的二进制1的个数相同&#xff0c;且A和B之间的距离|A-B|最小。思路&#xff1a; 题目没有说明整数类型&#xff0c;这里认为是带符号的整数&#xff0c;即区分正负数。 根据题意&#xff0c;A…

Java Swing –日期选择器对话框

房子里有Swing开发人员吗&#xff1f; 对于使用Swing的用户来说&#xff0c;这是一个GUI组件&#xff0c;可能会对您的UI编码工作有所帮助。 我们的JCG合作伙伴之一提供了日期选择器小部件。 一探究竟&#xff1a; Java Swing –日期选择器对话框以选择日期 翻译自: https://…

Casperjs中fill提交表单遇到的问题

1.if you access internet with proxy please add --ignore-ssl-errorstrue --ssl-protocolany 2.casper.then* and casper.wait* 都是异步执行的 他们的调用&#xff0c;都是按堆栈中的顺序来执行&#xff1b;也就是说&#xff0c;其他同步执行的函数&#xff0c;…

Xuggler视频处理简介

注意&#xff1a;这是我们的“ Xuggler开发教程 ”系列的一部分。 随着互联网上视频的爆炸式增长&#xff0c;开发人员经常需要在其应用程序中操纵视频内容。 Xuggler是Java开发人员的免费开放源代码库&#xff0c;可用于实时解压缩&#xff0c;处理和压缩录制的视频或实时视频…

软件测试中条件覆盖,路径覆盖,语句覆盖,分支覆盖的区别

转&#xff1a;软件测试中条件覆盖&#xff0c;路径覆盖&#xff0c;语句覆盖&#xff0c;分支覆盖的区别 举个例子吧 if A and B then Action1 if C or D then Action2 语句覆盖最弱&#xff0c;只需要让程序中的语句都执行一遍即可 …

Spring_讲解

http://s&#xff0c;i&#xff0c;s&#xff0c;h&#xff0c;u&#xff0c;o&#xff0c;k.com/forum/blogPost/list/6174.html转载于:https://www.cnblogs.com/gisblogs/p/4579162.html

使用Spring AspectJ和Maven进行面向方面的编程

Spring框架附带AOP支持。 实际上&#xff0c;如Spring参考文档中所述 &#xff0c; “ Spring的关键组件之一是AOP框架。 尽管Spring IoC容器不依赖于AOP&#xff0c;这意味着您不需要使用AOP&#xff0c;但AOP是对Spring IoC的补充&#xff0c;以提供功能强大的中间件解决方案…

hadoop5--mapreduce设计模式

运行结果附图 本节课程主要内容为学习MapReduc设计模式&#xff0c;并编写java程序对日志文件进行处理。 课本上介绍的MapReduce的设计模式主要包含:计数(Counting),分类(Classification),过滤处理(Filtering),排序(Sorting),去重计数(Distinct Counting),相关计数(Cross-Corre…

ES5中新增的Array方法详细说明

http://www.zhangxinxu.com/wordpress/2013/04/es5%E6%96%B0%E5%A2%9E%E6%95%B0%E7%BB%84%E6%96%B9%E6%B3%95/转载于:https://www.cnblogs.com/lmw425317/p/5339539.html

jqGrid,REST,AJAX和Spring MVC集成

两年多以前&#xff0c;我写了一篇关于两个如何在Struts2中实现优雅的CRUD的文章。 实际上&#xff0c;我必须就该主题写两篇文章&#xff0c;因为该主题如此广泛。 今天&#xff0c;我采用了一套更为流行的&#xff0c;完善的框架和库&#xff0c;采用了更为轻量级的现代方法。…

Java-马士兵设计模式学习笔记-代理模式--动态代理 修改成可以代理任意接口

一、概述 1.目标&#xff1a;把Proxy修改成可以代理任意接口及其任意方法 2.思路&#xff1a; (1)代理任意接口&#xff1a;把接口类型作为参数传给Proxy的newProxyInstance(Class interfze) (2)代理任意方法&#xff1a;用interfze.getMethods()取出所有方法&#xff0c;拼接实…

PTA习题

PTA习题 PTA浙大版《C语言程序设计&#xff08;第3版&#xff09;》 题目集5-6 水仙花数是指一个N位正整数&#xff08;N≥3&#xff09;&#xff0c;它的每个位上的数字的N次幂之和等于它本身。 本题要求编写两个函数&#xff0c;一个判断给定整数是否水仙花数&#xff0c;…

acdream 1409 Musical 状压DP

链接&#xff1a;http://acdream.info/problem?pid1409 题意&#xff1a;整个国家有n座城市&#xff0c;每座城市有三种粉丝。 第一种一周看一场音乐剧&#xff0c;挑选的音乐剧是已经在周围城市播放上演过的次数最多的音乐剧中的随机一个。 另外一种每天看一场音乐剧&#xf…

真正的模块化Web应用程序:为什么没有开发标准?

OSGI &#xff0c; SpringSource &#xff0c; Jboss模块 &#xff0c;J2EE和清单永远不会结束。所有这些技术都向他们的最终用户/开发人员保证了相同的东西&#xff0c;或多或少是Java模块化Web应用程序&#xff08;&#xff1f;&#xff09;。 但是&#xff0c;我们当中有多少…

C语言5-7习题

本题要求实现一个函数&#xff0c;用下列公式求cos(x)的近似值&#xff0c;精确到最后一项的绝对值小于e&#xff1a; #include <stdio.h> #include <math.h>double funcos( double e, double x );int main() { double e, x;scanf("%lf %lf", &…

JDBC批处理executeBatch

JDBC运行SQL声明&#xff0c;有两个处理接口&#xff0c;一PreparedStatement,Statement,一般程序JDBC有多少仍然比较PreparedStatement 只要运行批处理&#xff0c;PreparedStatement少一点Statement ps conn.prepareStatement(sql); for(int i 0;i<10;i){ ps.setString(…