springmvc机制拦截器aop异常.docx
- 文档编号:4612179
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:8
- 大小:972.58KB
springmvc机制拦截器aop异常.docx
《springmvc机制拦截器aop异常.docx》由会员分享,可在线阅读,更多相关《springmvc机制拦截器aop异常.docx(8页珍藏版)》请在冰豆网上搜索。
springmvc机制拦截器aop异常
◆Spring-mvc知识
Ø概念
SpringWebMVC是一种基于Java的实现了WebMVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringWebMVC也是要简化我们日常Web开发的。
图1SpringWebMVC核心架构图
理解这张图之前我们得先知道以下的几个名词:
前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器(Validator)、命令对象(Command请求参数绑定到的对象就叫命令对象)、表单对象(FormObject提供给表单展示和提交到的对象就叫表单对象)
步骤解析:
核心架构的具体流程步骤如下:
1、首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet——>HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
5、ModelAndView的逻辑视图名——>ViewResolver,ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
当然以上步骤中并没有去说明拦截器、事务、安全性,其描述的是具体的对象的流程,前者所说的是框架对象,所以使用的技术和原理则不一样。
◆HandlerInterceptor拦截器
Ø 概念
SpringMVC中的Interceptor拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理,其他的作用比如通过它来进行权限验证,或者是来判断用户是否登陆,日志记录,或者限制时间点访问。
ØInterceptor实现类及其方法
SpringMVC中的Interceptor拦截请求是通过HandlerInterceptor来实现的。
在SpringMVC中定义一个Interceptor非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor接口,或者是这个类继承实现了HandlerInterceptor接口的类,比如Spring已经提供的实现了HandlerInterceptor接口的抽象类HandlerInterceptorAdapter;第二种方式是实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。
HandlerInterceptor接口中定义了三个方法,我们就是通过这三个方法来对用户的请求进行拦截处理的。
(1)preHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandle)方法。
该方法将在请求处理之前进行调用。
SpringMVC中的Interceptor是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor。
每个Interceptor的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor中的preHandle方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。
该方法的返回值是布尔值Boolean类型的,当它返回为false时,表示请求结束,后续的Interceptor和Controller都不会再执行;当返回值为true时就会继续调用下一个Interceptor的preHandle方法,如果已经是最后一个Interceptor的时候就会是调用当前请求的Controller方法。
(2)postHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandle,ModelAndViewmodelAndView)方法,由preHandle方法的解释我们知道这个方法包括后面要说到的afterCompletion方法都只能是在当前所属的Interceptor的preHandle方法的返回值为true时才能被调用。
postHandle方法,顾名思义就是在当前请求进行处理之后,也就是Controller方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作。
postHandle方法被调用的方向跟preHandle是相反的,也就是说先声明的Interceptor的postHandle方法反而会后执行,这和Struts2里面的Interceptor的执行过程有点类型。
Struts2里面的Interceptor的执行过程也是链式的,只是在Struts2里面需要手动调用ActionInvocation的invoke方法来触发对下一个Interceptor或者是Action的调用,然后每一个Interceptor中在invoke方法调用之前的内容都是按照声明顺序执行的,而invoke方法之后的内容就是反向的。
(3)afterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandle,Exceptionex)方法,该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。
顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行。
这个方法的主要作用是用于进行资源清理工作的。
我们的系统日志的拦截在这个方法中,可以记录日志的相关的参数,检测方法的执行。
Ø拦截器的配置
图2系统springmvc拦截器
这三个方法的代码可以参考Interceptor.java
Ø拦截器日志模块运用
1.获取MAC地址
2.获取用户请求的参数
3.获取异常
4.获取其所操作的所有的类
可以访问LogInterceptor.java
◆AOP的原理与实现
Ø概念
AOP是OOP的延续,是AspectOrientedProgramming的缩写,意思是面向切面编程。
可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
我们现在做的一些非业务,如:
日志、事务、安全等都会写在业务代码中(也即是说,这些非业务类横切于业务类),但这些代码往往是重复,复制——粘贴式的代码会给程序的维护带来不便,AOP就实现了把这些业务需求与系统需求分开来做。
这种解决的方式也称代理机制。
先来了解一下AOP的相关概念,《Spring参考手册》中定义了以下几个AOP的重要概念,结合以上代码分析如下:
切面(Aspect):
官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”,在本例中,“切面”就是类TestAspect所关注的具体行为,例如,AServiceImpl.barA()的调用就是切面TestAspect所关注的行为之一。
“切面”在ApplicationContext中 aspect>来配置。 连接点(Joinpoint) : 程序执行过程中的某一行为,例如,UserService.get的调用或者UserService.delete抛出异常等行为。 通知(Advice) : “切面”对于某个“连接点”所产生的动作,例如,TestAspect中对com.spring.service包下所有类的方法进行日志记录的动作就是一个Advice。 其中,一个“切面”可以包含多个“Advice”,例如ServiceAspect。 切入点(Pointcut) : 匹配连接点的断言,在AOP中通知和一个切入点表达式关联。 例如,TestAspect中的所有通知所关注的连接点,都由切入点表达式execution(*com.spring.service.*.*(..))来决定。 目标对象(TargetObject) : 被一个或者多个切面所通知的对象。 例如,AServcieImpl和BServiceImpl,当然在实际运行时,SpringAOP采用代理实现,实际AOP操作的是TargetObject的代理对象。 AOP代理(AOPProxy) : 在SpringAOP中有两种代理方式,JDK动态代理和CGLIB代理。 默认情况下,TargetObject实现了接口时,则采用JDK动态代理,例如,AServiceImpl;反之,采用CGLIB代理,例如,BServiceImpl。 强制使用CGLIB代理需要将 config>的proxy-target-class属性设为true。 通知(Advice)类型: 前置通知(Beforeadvice): 在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。 ApplicationContext中在 aspect>里面使用 before>元素进行声明。 例如,TestAspect中的doBefore方法。 后置通知(Afteradvice): 当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。 ApplicationContext中在 aspect>里面使用 after>元素进行声明。 例如,ServiceAspect中的returnAfter方法,所以Teser中调用UserService.delete抛出异常时,returnAfter方法仍然执行。 返回后通知(Afterreturnadvice): 在某连接点正常完成后执行的通知,不包括抛出异常的情况。 ApplicationContext中在 aspect>里面使用 环绕通知(Aroundadvice): 包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。 可以在方法的调用前后完成自定义的行为,也可以选择不执行。 ApplicationContext中在 aspect>里面使用 around>元素进行声明。 例如,ServiceAspect中的around方法。 抛出异常后通知(Afterthrowingadvice): 在方法抛出异常退出时执行的通知。 ApplicationContext中在 aspect>里面使用 after-throwing>元素进行声明。 例如,ServiceAspect中的returnThrow方法。 ØAOP的配置和运用 Aop的配置文件: aop的配置.xml。 使用注意: 1、tomact使用注意: 在.XML文件支持aop的情况下,需要的配置文件中加入以下的代码: 2.注意aop切入点的表达式 Aop的bean文件 ◆Exception的处理 Ø概念 SpringMVC提供的异常处理主要有两种方式,一种是直接实现自己的HandlerExceptionResolver,另一种是使用注解的方式实现一个专门用于处理异常的Controller——ExceptionHandler。 前者当发生异常时,页面会跳到指定的错误页面,后者同样,只是后者会在每个controller中都需要加入重复的代码。 如何进行简单地统一配置异常,使得发生普通错误指定到固定的页面,ajax发生错直接通过js获取,展现给用户,变得非常重要。 下面先介绍下2种异常处理方式,同时,结合现有的代码,让其支持ajax方式,实现springMVCweb系统的异常统一处理。 1、实现自己的HandlerExceptionResolver。 HandlerExceptionResolver是一个接口,springMVC本身已经对其有了一个自身的实现——DefaultExceptionResolver,该解析器只是对其中的一些比较典型的异常进行了拦截处理。 图4全局异常控制 2、使用@ExceptionHandler进行处理 使用@ExceptionHandler进行处理有一个不好的地方是进行异常处理的方法必须与出错的方法在同一个Controller里面。 图4局部异常控制 Ø异常的配置 在web.xml中使用异常的超类进行全局设置,让其跳转到异常页,达到监控所有的异常的目的。 图5异常wen.xml配置 图6异常bean 欢迎您的下载, 资料仅供参考! 致力为企业和个人提供合同协议,策划案计划书,学习资料等等 打造全网一站式需求
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- springmvc 机制 拦截 aop 异常
![提示](https://static.bdocx.com/images/bang_tan.gif)