由于项目用的是注解的方式进行注入的如:@Controller 所以在加AOP拦截的时候有时用其它方法拦截不到。
可通过如下方式进行拦截:
<bean id="aopAspect" class="com.test.aop.AopAspect"/> <aop:config> <aop:aspect ref="aopAspect"> <aop:pointcut id="businessController" expression="execution(* org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(..))"/> <aop:before method="doBefore" pointcut-ref="businessController"/> <aop:after method="doAfter" pointcut-ref="businessController"/> <aop:around method="doAround" pointcut-ref="businessController"/> <aop:after-throwing method="doThrowing" pointcut-ref="businessController" throwing="ex"/> </aop:aspect> </aop:config>
其中AopAspect.java的内容如下:
package com.test.aop; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; /* * JoinPoint介绍: * java.lang.Object[] getArgs():获取连接点方法运行时的入参列表; * Signature getSignature() :获取连接点的方法签名对象; * java.lang.Object getTarget() :获取连接点所在的目标对象; * java.lang.Object getThis() :获取代理对象本身; * * ReqestFacade、ResponseFacade、具体的Controller */ /** * 权限控制(切面类) */ public class AopAspect { public void doBefore(JoinPoint jp) throws Exception { HttpServletRequest request = null; HttpServletResponse response = null; Object[] objs = jp.getArgs(); System.out.println("-----------------log Begining method: " + jp.getClass().getName() + "." + jp.getSignature().getName()); for (Object o : objs) { System.out.println("args = " + o); if (o instanceof HttpServletRequest) { request = (HttpServletRequest) o; System.out.println("---------------servletPath----- " + request.getServletPath()); } } } public void doAfter(JoinPoint jp) throws Exception { System.out.println("-----------------log Ending method: " + jp.getClass().getName() + "." + jp.getSignature().getName()); } public Object doAround(ProceedingJoinPoint pjp) throws Throwable { long time = System.currentTimeMillis(); HttpServletRequest request = null; HttpServletResponse response = null; time = System.currentTimeMillis() - time; Object[] objs = pjp.getArgs(); for (Object o : objs) { if (o instanceof HttpServletRequest) { request = (HttpServletRequest) o; } if (o instanceof HttpServletResponse) { response = (HttpServletResponse) o; } } Object retVal = pjp.proceed(); System.out.println("-----------------around process time: " + time + " ms"); return retVal; } public void doThrowing(JoinPoint jp, Throwable ex) { System.out.println("-----------------throwing method " + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName() + " throw exception"); System.out.println(ex.getMessage()); } /** * 判断是否为ajax请求 * @param request * @return true为ajax语法,false为其它。 */ private boolean isAjaxRequest(HttpServletRequest request) { if (request != null) { String requestType = request.getHeader("X-Requested-With"); if (requestType != null && "XMLHttpRequest".equals(requestType)) { return true; } } return false; } }
相关推荐
拦截器在CXF中的工作原理基于JAX-WS规范,可以分为两种类型:`InInterceptors`(入站拦截器)和`OutInterceptors`(出站拦截器)。入站拦截器处理从客户端到服务器的消息,而出站拦截器则处理从服务器返回到客户端的...
整合了ssh的基本开发步骤,把所有功能以及怎么实现需要的jai包作用全部包含在里面 配套一个案例包含增删改查
Spring框架本身是一个全面的企业级应用开发框架,核心特性包括依赖注入(DI)、面向切面编程(AOP)和容器管理。Spring 4.1.6版本增强了对Java 8的支持,提供了更丰富的类型安全的配置选项,并提升了性能和稳定性。 ...
在"SprinigBoot权限demo基本环境的框架.rar"中,我们可能找到了一个基础的SpringBoot项目,该项目已经配置了Spring Security,用于演示如何在SpringBoot应用中实现权限管理。这个压缩包可能包含了以下关键文件: 1....
在大数据量、高并发的场景下,批量更新数据库是一个常见的操作。然而,不同的批量更新方法可能带来截然不同的性能表现。 通过实际测试对比了Spring Boot中6种MySQL批量更新方式的效率,并详细记录了每种方法在处理...
SpringBoot+Vue+kkFileView实现文档管理(文档上传、下载、在线预览)示例代码: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/128283542 import com.ruoyi.system.utils.FileUtils,此类见若依开发...
SpringBoot+JPA是一个流行的Java开发框架组合,用于构建高效、简洁的应用程序。SpringBoot简化了Spring应用的初始设置和配置,而Java Persistence API (JPA) 是Java平台上的一个标准,用于对象关系映射(ORM),使得...