Spring AOP中对拦截器调用的实现

合集下载

拦截器的实现原理

拦截器的实现原理

拦截器的实现原理拦截器是应用程序开发中常用的一种技术,用于在请求到达目标对象之前或者之后对请求进行处理或者操纵。

它是一种面向切面编程的实现方式,通过动态代理机制对请求进行拦截并进行相关的处理。

1. 动态代理机制:拦截器通常使用动态代理机制来实现对目标对象的拦截,它通过创建目标对象的代理对象并将请求转发给代理对象来实现拦截的效果。

动态代理可以分为两种方式,一种是基于接口的动态代理(JDK Proxy),另一种是基于类的动态代理(CGLIB)。

2. AOP和切面编程:拦截器使用AOP(Aspect Oriented Programming)和切面编程的思想来实现,将各种功能独立封装成切面,并通过拦截器来将切面应用于目标对象的方法调用。

切面是一个横切关注点的模块化单元,它可以包含任何功能,如事务管理、日志记录、性能监控等。

3.方法拦截:拦截器通过对目标对象的方法进行拦截实现请求的截获和处理。

拦截器可以在目标方法调用之前、之后或者异常发生时进行相关处理。

在方法调用之前,拦截器可以进行参数验证、权限检查等操作;在方法调用之后,拦截器可以进行结果处理、事务提交等操作;在方法发生异常时,拦截器可以进行异常处理、事务回滚等操作。

4.链式调用:拦截器的实现通常采用链式调用的方式,将多个拦截器串联起来形成一个拦截器链。

请求会按照拦截器链的顺序进行处理,每个拦截器都可以对请求进行拦截和处理。

如果一个拦截器放行了请求,后面的拦截器将会继续处理;如果拦截器中止了请求,后面的拦截器将不再执行。

5.反射机制:拦截器在对目标方法进行拦截时通常使用反射机制来调用目标方法。

通过反射,拦截器可以获取目标方法的参数、返回值等信息,并进行相应的处理。

同时,反射机制还可以在运行时动态修改方法的行为,实现拦截和操纵请求的效果。

综上所述,拦截器的实现原理主要包括动态代理、AOP和切面编程、方法拦截、链式调用和反射机制等方面。

拦截器通过动态代理机制创建代理对象,并通过对目标对象方法进行拦截和处理来实现对请求的拦截。

Springinterceptor拦截器配置及用法解析

Springinterceptor拦截器配置及用法解析

Springinterceptor拦截器配置及⽤法解析fifter、servlet、interceptorfifter⽤来处理请求头、请求参数、编码的⼀些设置,然后转交给servlet,处理业务,返回servlet现在常⽤的spring,servlet拦截/到DispatcherServlet,交由spring管理interceptor,servlet请求之后可以实现HandlerInterceptor做到preHandle、postHandle、afterCompletion在controller之前、之后、渲染之后登陆业务中常⽤的登陆、注册,⼤部分⽤cookie、session来做,这时候就涉及到拦截判断⽤户是否登陆、是否有权限?⾄此引出interceptor:package com.bs.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import com.bs.controller.BaseController;import com.bs.entity.Member;public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {Member member = BaseController.getMemberByCookie(request);System.out.println(member);if(member == null){response.sendRedirect("/officialweb/login.html");}return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// TODO Auto-generated method stub}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {// TODO Auto-generated method stub}}java代码如上,然后在servlet.xml中配置如下:<!-- 拦截器 --><!-- 多个拦截器,顺序执⾏ --><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><mvc:exclude-mapping path="/**/cloud/**" /><mvc:exclude-mapping path="/**/login/**" /><bean class="com.bs.interceptor.LoginInterceptor"></bean></mvc:interceptor></mvc:interceptors>mvc:mapping拦截的path地址,mvc:exclude-mapping不拦截的path地址,⽐如⼀些登陆、注册、验证码、和可以不登录操作的接⼝。

Java三大器之拦截器(Interceptor)的实现原理及代码示例

Java三大器之拦截器(Interceptor)的实现原理及代码示例

Java三⼤器之拦截器(Interceptor)的实现原理及代码⽰例1,拦截器的概念java⾥的拦截器是动态拦截Action调⽤的对象,它提供了⼀种机制可以使开发者在⼀个Action执⾏的前后执⾏⼀段代码,也可以在⼀个Action执⾏前阻⽌其执⾏,同时也提供了⼀种可以提取Action中可重⽤部分代码的⽅式。

在AOP中,拦截器⽤于在某个⽅法或者字段被访问之前,进⾏拦截然后再之前或者之后加⼊某些操作。

⽬前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不⽤深究,知道即可。

2,拦截器的原理⼤部分时候,拦截器⽅法都是通过代理的⽅式来调⽤的。

Struts2的拦截器实现相对简单。

当请求到达Struts2的ServletDispatcher时,Struts2会查找配置⽂件,并根据配置实例化相对的拦截器对象,然后串成⼀个列表(List),最后⼀个⼀个的调⽤列表中的拦截器。

Struts2的拦截器是可插拔的,拦截器是AOP的⼀个实现。

Struts2拦截器栈就是将拦截器按⼀定的顺序连接成⼀条链。

在访问被拦截的⽅法或者字段时,Struts2拦截器链中的拦截器就会按照之前定义的顺序进⾏调⽤。

3,⾃定义拦截器的步骤第⼀步:⾃定义⼀个实现了Interceptor接⼝的类,或者继承抽象类AbstractInterceptor。

第⼆步:在配置⽂件中注册定义的拦截器。

第三步:在需要使⽤Action中引⽤上述定义的拦截器,为了⽅便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的Action都被这个拦截器拦截。

4,过滤器与拦截器的区别过滤器可以简单的理解为“取你所想取”,过滤器关注的是web请求;拦截器可以简单的理解为“拒你所想拒”,拦截器关注的是⽅法调⽤,⽐如拦截敏感词汇。

4.1,拦截器是基于java反射机制来实现的,⽽过滤器是基于函数回调来实现的。

(有⼈说,拦截器是基于动态代理来实现的)4.2,拦截器不依赖servlet容器,过滤器依赖于servlet容器。

AOP方法拦截获取参数上的注解

AOP方法拦截获取参数上的注解

AOP⽅法拦截获取参数上的注解获取参数注解在spring aop中,⽆论是前置通知的参数JoinPoint,还是环绕通知的参数ProceedingJoinPoint,都可以通过以下⽅法获得⼊参: MethodSignature signature= (MethodSignature) jp.getSignature();根据源码分析,MethodSignature封装了两个⽅法,⼀个获取⽅法的返回值类型,⼀个是获取封装的Method对象,getReturnType()可以⽤在环绕通知中,我们可以根据这个class类型,做定制化操作.⽽method的参数和参数上的注解,就可以从getMethod()返回的Method对象中拿,api如下:// 获取⽅法上的注解XXX xxx = signature.getMethod().getAnnotation(XXX.class)//获取所有参数上的注解Annotation[][] parameterAnnotations= signature.getMethod().getParameterAnnotations();只有所有的参数注解怎么获取对应参数的值呢?获取所有参数注解返回的是⼀个⼆维数组Annotation[][],每个参数上可能有多个注解,是⼀个⼀维数组,多个参数⼜是⼀维数组,就组成了⼆维数组,所有我们在遍历的时候,第⼀次遍历拿到的数组下标就是⽅法参数的下标,for (Annotation[] parameterAnnotation: parameterAnnotations) {int paramIndex= ArrayUtils.indexOf(parameterAnnotations, parameterAnnotation);}再根据Object[] args= joinPoint.getArgs();拿到所有的参数,根据指定的下标即可拿到对象的值for (Annotation[] parameterAnnotation: parameterAnnotations) {int paramIndex= ArrayUtils.indexOf(parameterAnnotations, parameterAnnotation);for (Annotation annotation: parameterAnnotation) {if (annotation instanceof XXX){Object paramValue = args[paramIndex]}}}通过以上⽅法,即可找到你想要的参数注解,并拿到对应参数的值啦!。

SpringAOP示例与实现原理总结——传统springaop、基于切面注入、基于@Asp。。。

SpringAOP示例与实现原理总结——传统springaop、基于切面注入、基于@Asp。。。

SpringAOP⽰例与实现原理总结——传统springaop、基于切⾯注⼊、基于@Asp。

⼀、代码实践1)经典的Spring Aop经典的spring aop,是基于动态代理技术的。

实现⽅式上,最常⽤的是实现MethodInterceptor接⼝来提供环绕通知,创建若⼲代理,然后使⽤ProxyBeanFactory配置⼯⼚bean,⽣成拦截器链,完成拦截。

⽰例如下:1package demo.spring;23import org.aopalliance.intercept.MethodInterceptor;4import org.aopalliance.intercept.MethodInvocation;5import org.junit.Test;6import org.junit.runner.RunWith;7import org.springframework.beans.factory.annotation.Autowired;8import org.springframework.test.context.ContextConfiguration;9import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;1011 @RunWith(SpringJUnit4ClassRunner.class)12 @ContextConfiguration("classpath:spring-config.xml")13public class TraditionalSpringAopDemo {14 @Autowired15private Service proxy;1617 @Test18public void test() {19 proxy.execute("hello world!");20 }21 }2223interface Service {24void execute(String str);25 }2627class ServiceImpl implements Service {28 @Override29public void execute(String str) {30 System.out.println("execute invoke: " + str);31 }32 }3334class Interceptor1 implements MethodInterceptor {35 @Override36public Object invoke(MethodInvocation methodInvocation) throws Throwable {37 System.out.println("interceptor1,before invoke");38 Object ret = methodInvocation.proceed();39 System.out.println("interceptor1,after invoke");40return ret;41 }42 }4344class Interceptor2 implements MethodInterceptor {45 @Override46public Object invoke(MethodInvocation methodInvocation) throws Throwable {47 System.out.println("interceptor2,before invoke");48 Object ret = methodInvocation.proceed();49 System.out.println("interceptor2,after invoke");50return ret;51 }52 }xml⽂件配置:1<?xml version="1.0" encoding="UTF-8"?>2<beans xmlns="/schema/beans"3 xmlns:xsi="/2001/XMLSchema-instance"4 xmlns:context="/schema/context"5 xmlns:aop="/schema/aop"6 xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd /schema/context /schema/context/sprin 78<context:component-scan base-package="demo.spring"/>910<bean class="demo.spring.ServiceImpl" id="service"></bean>11<bean class="demo.spring.Interceptor1" id="interceptor1"></bean>12<bean class="demo.spring.Interceptor2" id="interceptor2"></bean>13<bean class="org.springframework.aop.framework.ProxyFactoryBean" id="proxy">14<property name="target" ref="service"/>15<property name="interceptorNames">16<list>17<value>interceptor1</value>18<value>interceptor2</value>19</list>20</property>21</bean>22</beans>结果:interceptor1,before invokeinterceptor2,before invokeexecute invoke: hello world!interceptor2,after invokeinterceptor1,after invoke可以看到拦截链的执⾏过程与拦截器顺序的关系。

面试之Spring框架IOC和AOP的实现原理

面试之Spring框架IOC和AOP的实现原理

⾯试之Spring框架IOC和AOP的实现原理本⽂讲的是⾯试之Spring框架IOC和AOP的实现原理, IoC(Inversion of Control) (1). IoC(Inversion of Control)是指容器控制程序对象之间的关系,⽽不是传统实现中,由程序代码直接操控。

控制权由应⽤代码中转到了外部容器,控制权的转移是所。

IoC(Inversion of Control)(1). IoC(Inversion of Control)是指容器控制程序对象之间的关系,⽽不是传统实现中,由程序代码直接操控。

控制权由应⽤代码中转到了外部容器,控制权的转移是所谓反转。

对于Spring⽽⾔,就是由Spring来控制对象的⽣命周期和对象之间的关系;IoC还有另外⼀个名字——“依赖注⼊(Dependency Injection)”。

从名字上理解,所谓依赖注⼊,即组件之间的依赖关系由容器在运⾏期决定,即由容器动态地将某种依赖关系注⼊到组件之中。

(2). 在Spring的⼯作⽅式中,所有的类都会在spring容器中登记,告诉spring这是个什么东西,你需要什么东西,然后spring会在系统运⾏到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。

所有的类的创建、销毁都由 spring来控制,也就是说控制对象⽣存周期的不再是引⽤它的对象,⽽是spring。

对于某个具体的对象⽽⾔,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

(3). 在系统运⾏中,动态的向某个对象提供它所需要的其他对象。

(4). 依赖注⼊的思想是通过反射机制实现的,在实例化⼀个类时,它通过反射调⽤类中set⽅法将事先保存在HashMap中的类属性注⼊到类中。

总⽽⾔之,在传统的对象创建⽅式中,通常由调⽤者来创建被调⽤者的实例,⽽在Spring中创建被调⽤者的⼯作由Spring来完成,然后注⼊调⽤者,即所谓的依赖注⼊or控制反转。

Spring方法拦截器MethodInterceptor

Spring方法拦截器MethodInterceptor实现MethodInterceptor接口,在调用目标对象的方法时,就可以实现在调用方法之前、调用方法过程中、调用方法之后对其进行控制。

MethodInterceptor接口可以实现MethodBeforeAdvice接口、AfterReturningAdvice接口、ThrowsAdvice接口这三个接口能够所能够实现的功能,但是应该谨慎使用MethodInterceptor 接口,很可能因为一时的疏忽忘记最重要的MethodInvocation而造成对目标对象方法调用失效,或者不能达到预期的设想。

关于含有Advice的三种对目标对象的方法的增强,可以参考文章在Spring的IOC容器中装配AOP代理。

在在Spring的IOC容器中装配AOP代理的基础上,比较MethodInterceptor接口的实现与上面提及到的三种接口实现对目标对象方法的增强的功能效果。

我们将从应用中分离出日志切面,,将对日志的操作整合到实现MethodInterceptor接口的类SpringMethodInterceptor中,该实现类的代码如下所示:package org.shirdrn.spring.aop;import java.util.Date;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;public class SpringMethodInterceptor implements MethodInterceptor {public Object invoke(MethodInvocation invo) throws Throwable {Object[] object = invo.getArguments();try{String date1 = (new Date()).toLocaleString();System.out.println("信息:[MethodInterceptor]["+date1+"]用户"+object[0]+" 正在尝试登录陆系统...");Object returnObject = invo.proceed();String date2 = (new Date()).toLocaleString();System.out.println("信息:[MethodInterceptor]["+date2+"]用户"+object[0]+" 成功登录系统.");return returnObject;}catch(Throwable throwable){if(object[0].equals("Jessery")){throw new Exception("信息:[MethodInterceptor]不允许黑名单中用户"+object[0]+" 登录系统");}}return object;}}程序中,红色标示的代码行Object returnObject =invo.proceed();很关键,只有通过它来对目标对象方法调用,返回一个Object对象。

AOP事务管理的原理与及三种实现方式

AOP事务管理的原理与及三种实现方式AOP(Aspect-Oriented Programming)即面向切面编程,是一种软件开发方法,主要用于解决分散在一个应用程序中的横切关注点(cross-cutting concerns)问题。

事务管理是AOP的一个典型应用场景,它主要用于保证一系列操作的原子性、一致性和隔离性。

本文将详细介绍AOP事务管理的原理以及三种常见的实现方式。

一、AOP事务管理原理1.拦截器执行顺序首先,AOP框架通过拦截器机制,将事务相关的拦截器按照一定的顺序进行执行。

常见的拦截器有前置拦截器(Before)、后置拦截器(After)、异常拦截器(AfterThrowing)、返回拦截器(AfterReturning)等。

2.事务传播和隔离级别在方法级别的事务管理中,每个被拦截的方法可以有不同的事务传播行为和隔离级别。

事务传播行为指的是当一个方法调用另外一个方法时,如何处理事务;隔离级别指的是事务之间的隔离程度。

3.事务切面的应用通过拦截器机制,将事务注解或者配置文件中的事务属性传递给事务管理器,然后由事务管理器根据事务属性进行事务操作。

实际应用中,可以使用Spring框架提供的AOP事务管理功能来实现对方法级别的事务控制。

根据AOP事务管理的原理,常见的AOP事务管理的实现方式有基于注解的方式、基于XML配置的方式和基于编程的方式。

1.基于注解的方式优点:(1)简单方便,只需在方法上加上注解即可进行事务管理。

(2)灵活可控,通过注解可以更细粒度地控制事务的传播行为和隔离级别。

(3)清晰明了,注解能够直观地体现出事务的特性。

缺点:(1)侵入性较强,需要在代码中添加注解。

(2)不能对第三方库中的方法进行事务管理。

2.基于XML配置的方式基于XML配置的方式是通过在配置文件中定义事务管理器、事务通知以及切点表达式等信息,来实现对方法级别的事务控制。

通过AOP框架读取配置文件,将事务相关的信息应用到需要进行事务管理的方法上。

关于Springboot过滤器,拦截器和AOP的执行顺序

博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
关于 Springboot过滤器,拦截器和 AOP的执行顺序
今天在Springboot项目中遇到个问题,在AOP中进行日志处理时,并不能处理拦截器interceptor中的日志,开始以为是AOP的优先级问题,后来把AOP日志切面的加载顺序用 @Ordered(这里注意切面不设置@Ordered时在所有切面中优先级最低,设置的数值越小优先级越高)调整到最高也还是不行,去网上找了一些资料,原来是拦截器会在AOP切 面之前进行加载。 下面是整理的一些资料:
后面有时间补充一下原理,

AOP编程实例:拦截器拦截拦截某个实现类的方法

AOP编程实例:拦截器拦截拦截某个实现类的⽅法第⼀步:配置实现MethodInterceptor的切⾯java代码1public class OutsideInvokeLogInterceptor implements MethodInterceptor{2private static Logger log = Logger.getLogger("outsideInvoke");34 @Override5public Object invoke(MethodInvocation invocation) throws Throwable {6 String methodName = invocation.getMethod().toString();7 Object returnValue = invocation.proceed();8if (returnValue == null) {9 log.warn("调⽤ " + methodName + "is fail,返回的result结果为空,⽅法⼊参为:(" + parseArguments(invocation.getArguments()) + ")");10return ResultDTO.getFailureResult(BSErrorCode.INTERNAL_ERROR, BaseKeyMsgCode.RETURN_RESULTDTO_IS_NULL);11 }else{12if(returnValue instanceof ResultDTO){13 ResultDTO<Object> resultDTO = (ResultDTO<Object>)returnValue;14if(!resultDTO.isSuccess()){15 log.warn("调⽤ " + methodName + " is fail ,⽅法⼊参为:(" + parseArguments(invocation.getArguments()) + ")"16 + "返回值:" +resultDTO.getCode() + "," + resultDTO.getKey());17 } else{18 ("调⽤ " + methodName + " is success ,⽅法⼊参为:(" + parseArguments(invocation.getArguments()) + ")");19 }20 }21 }22return returnValue;2324 }25 }View Code1<bean id="outsideInvokeLogAdvice" class="mons.service.interceptor.OutsideInvokeLogInterceptor"/>View Code配置切点:1<bean id="methodPointcut" class="MatchMethodPointcut">2<property name="mappedNames">3<list>4<value>add*</value>5</list>6</property>7</bean>View Code配置⾃动代理:1<bean id="outsideInvokeLogInterceptor" class="org.springframework.aop.support.DefaultPointcutAdvisor">2<property name="pointcut" ref="methodPointcut"/>3<property name="advice" ref="outsideInvokeLogAdvice"/>4</bean>5<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">6<property name="beanNames">7<list><value>activityService</value></list>8</property>9<property name="interceptorNames">10<list>11<value>outsideInvokeLogInterceptor</value>12</list>13</property>14</bean>View Code。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档