您的位置:365bet体育备用网址器 > 应用 > 前端请求拦截,Aop有的人说拦截不到Controller

前端请求拦截,Aop有的人说拦截不到Controller

2019-10-31 22:38

Spring框架下的 “接口调用、MVC需要” 调用参数、再次来到值、耗费时间消息输出,springmvc

驷不及舌拦截前端或后天的央求,打字与印刷诉求方法参数、重临值、耗费时间、至极的日志。方便开采调节和测量试验,能相当慢定位到标题出以后哪些方法中。

 

 365bet在线官网 1

365bet在线官网 2

前端诉求拦截,mvc的拦截器

365bet在线官网 3 1 import java.util.Date; 2 import java.util.Iterator; 3 import java.util.Map; 4 import java.util.Set; 5 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 import org.codehaus.jackson.map.ObjectMapper; 10 import org.springframework.core.NamedThreadLocal; 11 import org.springframework.web.servlet.HandlerInterceptor; 12 import org.springframework.web.servlet.ModelAndView; 13 14 import com.xxx.eduyun.sdk.log.ApplicationLogging; 15 import com.xxx.flipclass.sdk.client.utils.TimeUtil; 16 17 /** 18 * <b>function:</b> spring mvc 央求拦截器 19 * @author hoojo 20 * @createDate 2016-11-24 下午3:19:27 21 * @file MVCRequestInterceptor.java 22 * @package com.xxx.eduyun.app.mvc.interceptor 23 * @project eduyun-app-web 24 * @blog 25 * @email [email protected] 26 * @version 1.0 27 */ 28 public class MVCRequestInterceptor extends ApplicationLogging implements HandlerInterceptor { 29 30 private static final ObjectMapper mapper = new ObjectMapper(); 31 private NamedThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<Long>("StopWatch-startTimed"); 32 33 @Override 34 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 35 36 37 info("##############################【八个MVC完整央求早先】##############################"); 38 39 info("*******************MVC业务管理起来**********************"); 40 try { 41 long timed = System.current提姆eMillis(); 42 startTimeThreadLocal.set(timed); 43 44 String requestULANDL = request.getRequestU路虎极光I(); 45 info("当前伏乞的U福特ExplorerL:【{}】", requestU普拉多L); 46 info("执行对象措施: {}", handler); 47 48 Map<String, ?> params = request.getParameterMap(); 49 if (!params.isEmpty()) { 50 info("当前哀求参数打印:"); 51 print(request.getParameterMap(), "参数"); 52 } 53 } catch (Exception e) { 54 error("MVC业务管理-拦截器至极:", e); 55 } 56 info("*******************MVC业务管理完结**********************"); 57 58 return true; 59 } 60 61 @Override 62 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 63 64 info("*******************贰个MVC 视图渲染开首**********************"); 65 66 try { 67 info("施行职业逻辑代码耗时:【{}】", TimeUtil.formatTime(new Date().getTime() - startTimeThreadLocal.get())); 68 String requestU福特ExplorerL = request.getRequestU牧马人I(); 69 info("当前倡议的UGL450L:【{}】", requestUSportageL); 70 71 if (modelAndView != null) { 72 info("将要再次来到到MVC视图:{}", modelAndView.getViewName()); 73 74 if (modelAndView.getView() != null) { 75 info("重回到MVC视图内容类型ContentType:{}", modelAndView.getView().getContentType()); 76 } 77 78 if (!modelAndView.getModel().isEmpty()) { 79 80 info("再次回到到MVC视图{}数据打字与印刷如下:", modelAndView.getViewName()); 81 print(modelAndView.getModel(), "重回数据"); 82 } 83 } 84 } catch (Exception e) { 85 error("MVC 视图渲染-拦截器非常:", e); 86 } 87 88 info("*******************贰个MVC 视图渲染结束**********************"); 89 } 90 91 @Override 92 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 93 94 try { 95 String requestU汉兰达L = request.getRequestUQX56I(); 96 info("MVC再次回到央浼实现U卡宴L:【{}】", requestULX570L); 97 info("MVC再次回到诉求完结耗时:【{}】", TimeUtil.formatTime(new Date().getTime() - startTimeThreadLocal.get())); 98 if (ex != null) { 99 info("MVC重临伏乞爆发非常:", ex.getMessage()); 100 error("相当新闻如下:", ex); 101 } 102 } catch (Exception e) { 103 error("MVC实现再次来到-拦截器卓殊:", e); 104 } 105 106 info("##############################【多个MVC完整伏乞达成】##############################"); 107 } 108 109 private void print(Map<String, ?> map, String prefix) { 110 if (map != null) { 111 Set<String> keys = map.keySet(); 112 Iterator<String> iter = keys.iterator(); 113 while (iter.hasNext()) { 114 115 String name = iter.next(); 116 if (name.contains("org.springframework.validation.BindingResult")) { 117 continue; 118 } 119 120 String value = ""; 121 try { 122 value = mapper.writeValueAsString(map.get(name)); 123 } catch (Exception e) { 124 error("调换参数【{}】发生极度:", name, e); 125 } 126 info("{} "{}": {}", prefix, name, value); 127 } 128 } 129 } 130 } View Code

spring-mvc.xml增添计划内容

365bet在线官网 4 1 <mvc:interceptors> 2 <mvc:interceptor> 3 <mvc:mapping path="/**"/> 4 <mvc:exclude-mapping path="/exceltemplate/**" /> 5 <mvc:exclude-mapping path="/statics/**" /> 6 <mvc:exclude-mapping path="/global/**" /> 7 <mvc:exclude-mapping path="/denied/**" /> 8 <mvc:exclude-mapping path="/favicon.ico" /> 9 <mvc:exclude-mapping path="/index.jsp" /> 10 <bean class="com.xxx.eduyun.app.mvc.interceptor.MVCRequestInterceptor"/> 11 </mvc:interceptor> 12 </mvc:interceptors> View Code

过滤静态能源,一些静态财富没有必要拦截,在那地配置黑名单不让它步向拦截器。

 

上面是sdk接口拦截器,用到spirng的aop的MethodIntercept

365bet在线官网 5 1 package com.xxx.flipclass.sdk.framework.aop; 2 3 import java.lang.reflect.Method; 4 import java.util.Date; 5 6 import org.aopalliance.intercept.MethodInterceptor; 7 import org.aopalliance.intercept.MethodInvocation; 8 import org.apache.logging.log4j.LogManager; 9 import org.apache.logging.log4j.Logger; 10 import org.codehaus.jackson.map.ObjectMapper; 11 12 import com.xxx.flipclass.sdk.client.utils.ParameterNameUtils; 13 import com.xxx.flipclass.sdk.client.utils.TimeUtil; 14 15 /** 16 * <b>function:</b> Spring 接口调用拦截器,首要拦截com.xxx.*.sdk.client对外接口 17 * @author hoojo 18 * @createDate 2016-11-24 下午5:39:57 19 * @file ExecutionApiLogMethodInterceptor.java 20 * @package com.xxx.eduyun.sdk.framework 21 * @project eduyun-sdk-service 22 * @blog 23 * @email [email protected] 24 * @version 1.0 25 */ 26 public class ExecutionApiLogMethodInterceptor implements MethodInterceptor { 27 28 private Logger log = LogManager.getLogger(ExecutionApiLogMethodInterceptor.class); 29 private static final ObjectMapper mapper = new ObjectMapper(); 30 31 @Override 32 public Object invoke(MethodInvocation invocation) throws Throwable { 33 34 info("************************************【接口调用拦截开首】*************************************"); 35 String targetName = invocation.getThis().getClass().getSimpleName(); 36 Method method = invocation.getMethod(); 37 String methodName = method.getName(); 38 39 info("系统开始执行形式:{}.{}", targetName, methodName); 40 41 info("【{}.{}】方法参数打字与印刷如下:", targetName, methodName); 42 Object[] args = invocation.getArguments(); 43 44 //printArgs(args, method, invocation.getThis().getClass()); 45 printArgs(args, method); 46 47 try { 48 long timed = System.currentTimeMillis(); 49 50 Object result = invocation.proceed(); 51 52 info("【{}.{}】方法试行到位,耗费时间:【{}】", targetName, methodName, TimeUtil.formatTime(new Date().getTime() - timed)); 53 info("【{}.{}】方法履行回来结果:{}", targetName, methodName, result); 54 55 info("【{}.{}】方法重回数据打字与印刷如下:", targetName, methodName); 56 printResult(result); 57 info("************************************【接口调用拦截甘休*】************************************"); 58 59 return result; 60 } catch (Throwable throwable) { 61 error("外界接口调用方法【{}.{}】十分:", targetName, methodName, throwable); 62 63 info("************************************【接口非常拦截停止】*************************************"); 64 throw throwable; 65 } 66 } 67 68 private void printArgs(Object[] args, Method method) { 69 try { 70 71 String[] argNames = null; 72 try { 73 argNames = ParameterNameUtils.getMethodParamNames(method); 74 } catch (Exception e) { 75 error("获取参数名称极其:", e); 76 } 77 78 if (args 365bet在线官网,!= null) { 79 for (int i = 0; i < args.length; i ) { 80 String argName = ""; 81 if (argNames != null && argNames.length >= i) { 82 argName = argNames[i]; 83 } 84 85 if (args[i] != null) { 86 String value = ""; 87 try { 88 value = mapper.writeValueAsString(args[i]); 89 } catch (Exception e) { 90 error("转变参数 "{}" 产生卓殊:", argName, e); 91 } 92 info("【参数 "{}" 】:({})", argName, value); 93 } else { 94 info("参数 "{}":NULL", argName); 95 } 96 } 97 } 98 } catch (Exception e) { 99 error("【接口调用拦截器】打字与印刷格局施行参数分外:", e); 100 } 101 } 102 103 private void printResult(Object result) { 104 if (result != null) { 105 try { 106 info("【重返数据】:({})", mapper.writeValueAsString(result)); 107 } catch (Exception e) { 108 error("重临数据打字与印刷极度:", e); 109 } 110 } else { 111 info("【重临数据】:NULL"); 112 } 113 } 114 115 protected final void error(String msg, Object... objects) { 116 log.error(msg, objects); 117 } 118 119 protected final void info(String msg, Object... objects) { 120 log.info(msg, objects); 121 } 122 } View Code

上边使用到了主意参数获取的工具类,代码如下:

365bet在线官网 6 1 package com.xxx.flipclass.sdk.client.utils; 2 3 import java.io.InputStream; 4 import java.lang.reflect.Method; 5 import java.lang.reflect.Modifier; 6 import java.util.Arrays; 7 8 import org.springframework.asm.ClassReader; 9 import org.springframework.asm.ClassVisitor; 10 import org.springframework.asm.ClassWriter; 11 import org.springframework.asm.Label; 12 import org.springframework.asm.MethodVisitor; 13 import org.springframework.asm.Opcodes; 14 import org.springframework.asm.Type; 15 16 /** 17 * <b>function:</b> 获取方式参预名称 18 * @createDate 2016-11-25 下午3:40:33 19 * @file ParameterNameUtils.java 20 * @package com.xxx.flipclass.sdk.client.utils 21 * @project flipclass-sdk-client 22 * @version 1.0 23 */ 24 public abstract class ParameterNameUtils { 25 26 /** 27 * 获取内定类内定方法的参数名 28 * 29 * @param clazz 要获取参数名的秘诀所属的类 30 * @param method 要获得参数名的格局 31 * @return 按参数顺序排列的参数名列表,若无参数,则赶回null 32 */ 33 public static String[] getMethodParamNames(Class<?> clazz, final Method method) throws Exception { 34 35 try { 36 37 final String[] paramNames = new String[method.getParameterTypes().length]; 38 String className = clazz.getName(); 39 40 int lastDotIndex = className.lastIndexOf("."); 41 className = className.substring(lastDotIndex 1) ".class"; 42 InputStream is = clazz.getResourceAsStream(className); 43 44 final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); 45 ClassReader cr = new ClassReader(is); 46 47 cr.accept(new ClassVisitor(Opcodes.ASM4, cw) { 48 @Override 49 public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature, final String[] exceptions) { 50 final Type[] args = Type.getArgumentTypes(desc); 51 // 方法名相似何况参数个数相像 52 if (!name.equals(method.getName()) || !sameType(args, method.getParameterTypes())) { 53 return super.visitMethod(access, name, desc, signature, exceptions); 54 } 55 MethodVisitor v = cv.visitMethod(access, name, desc, signature, exceptions); 56 return new MethodVisitor(Opcodes.ASM4, v) { 57 @Override 58 public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { 59 int i = index - 1; 60 // 如若是静态方法,则第生龙活虎就是参数 61 // 假如不是静态方法,则第一个是"this",然后才是办法的参数 62 if (Modifier.isStatic(method.getModifiers())) { 63 i = index; 64 } 65 if (i >= 0 && i < paramNames.length) { 66 paramNames[i] = name; 67 } 68 super.visitLocalVariable(name, desc, signature, start, end, index); 69 } 70 71 }; 72 } 73 }, 0); 74 return paramNames; 75 } catch (Exception e) { 76 throw e; 77 } 78 } 79 80 /** 81 * 相比参数类型是不是大器晚成致 82 * @param types asm的类型({@link Type}) 83 * @param clazzes java 类型({@link Class}) 84 * @return 85 */ 86 private static boolean sameType(Type[] types, Class<?>[] clazzes) { 87 // 个数差别 88 if (types.length != clazzes.length) { 89 return false; 90 } 91 92 for (int i = 0; i < types.length; i ) { 93 if (!Type.getType(clazzes[i]).equals(types[i])) { 94 return false; 95 } 96 } 97 return true; 98 } 99 100 /** 101 * 获取方式的参数名 102 * @param Method 103 * @return argsNames[] 104 */ 105 public static String[] getMethodParamNames(final Method method) throws Exception { 106 107 return getMethodParamNames(method.getDeclaringClass(), method); 108 } 109 110 public static void main(String[] args) throws Exception { 111 Class<ParameterNameUtils> clazz = ParameterNameUtils.class; 112 113 Method method = clazz.getDeclaredMethod("getMethodParamNames", Method.class); 114 String[] parameterNames = ParameterNameUtils.getMethodParamNames(method); 115 System.out.println(Arrays.toString(parameterNames)); 116 117 method = clazz.getDeclaredMethod("sameType", Type[].class, Class[].class); 118 parameterNames = ParameterNameUtils.getMethodParamNames(method); 119 System.out.println(Arrays.toString(parameterNames)); 120 } 121 } View Code

最后索要丰裕配置,拦截哪些接口或是达成类,具体看个人事务

365bet在线官网 7 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="" 3 xmlns:xsi="" 4 xmlns:aop="" 5 xsi:schemaLocation=" 6 7 8 ; 9 10 11 <bean id="externalApiMethodInterceptor" class="com.xxx.flipclass.sdk.framework.aop.ExecutionApiLogMethodInterceptor" /> 12 13 <aop:config proxy-target-class="true"> 14 <aop:pointcut id="externalApiMethodPointcut" expression="!execution(* com.xxx.flipclass.sdk.client.interfaces..*.loginInfoService.*(..)) and (execution(* com.xxx.*.sdk.client.interfaces..*.*Client*.*(..)) || execution(* com.xxx.*.sdk.client.interfaces..*.*Service*.*(..)))" /> 15 <aop:advisor advice-ref="externalApiMethodInterceptor" pointcut-ref="externalApiMethodPointcut" /> 16 </aop:config> 17 </beans> View Code

 

“接口调用、MVC诉求” 调用参数、重返值、耗费时间音信输出,springmvc 首要拦截前端或后天的伸手,打字与印刷央浼方法参数、重临值...

 

做日志管理最棒的是Aop,有的人也开心用拦截器。都得以,在那作者主要介绍自身的完毕格局。

Aop有人说拦截不到Controller。有一些人说想拦AnnotationMethodHandlerAdapter截到Controller必得得拦截org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter。

首先Aop可以阻碍到Controller的,那几个是毋容置疑的次要须拦截AnnotationMethodHandler艾达pter亦不是必须的。最最少笔者未有表明成功过这么些。我的Spring版本是4.0.3。

Aop之所以有人说拦截不到Controller是因为Controller被jdk代理了。大家若是把它交给cglib代理就足以了。

第一步定义多个申明:

Java代码 

[java] view plain copy

  1. package com.annotation;  
  2. import java.lang.annotation.*;  
  3. /** 
  4.  *自定义表明 拦截Controller 
  5.  */  
  6. @Target({ElementType.PARAMETER, ElementType.METHOD})  
  7. @Retention(RetentionPolicy.RUNTIME)  
  8. @Documented  
  9. public  @interface SystemControllerLog {  
  10.     String description()  default ”";  
  11. }  

[java] view plain copy

  1. package com.annotation;  
  2. import java.lang.annotation.*;  
  3. /** 
  4.  *自定义评释 拦截service 
  5.  */  
  6. @Target({ElementType.PARAMETER, ElementType.METHOD})  
  7. @Retention(RetentionPolicy.RUNTIME)  
  8. @Documented  
  9. public  @interface SystemServiceLog {  
  10.     String description()  default ”";  
  11. }  

 

其次步成立一个切点类:

Java代码 

[java] view plain copy

  1. package com.annotation;  
  2. import com.model.Log;  
  3. import com.model.User;  
  4. import com.service.LogService;  
  5. import com.util.DateUtil;  
  6. import com.util.JSONUtil;  
  7. import com.util.SpringContextHolder;  
  8. import com.util.WebConstants;  
  9. import org.aspectj.lang.JoinPoint;  
  10. import org.aspectj.lang.annotation.*;  
  11. import org.slf4j.Logger;  
  12. import org.slf4j.LoggerFactory;  
  13. import org.springframework.stereotype.Component;  
  14. import org.springframework.web.context.request.RequestContextHolder;  
  15. import org.springframework.web.context.request.ServletRequestAttributes;  
  16. import javax.annotation.Resource;  
  17. import javax.servlet.http.HttpServletRequest;  
  18. import javax.servlet.http.HttpSession;  
  19. import java.lang.reflect.Method;  
  20. /** 
  21.  * 切点类 
  22.  * @author zy
  23.  * @since 2017-09-28 Pm 14:40 
  24.  * @version 1.0 
  25.  */  
  26. @Aspect  
  27. @Component  
  28. public  class SystemLogAspect {  
  29.     //注入Service用于把日志保存数据库  
  30.     @Resource  
  31.      private LogService logService;  
  32.     //本地十分日志记录对象  
  33.      private  static  final Logger logger = LoggerFactory.getLogger(SystemLogAspect. class);  
  34.     //Service层切点  
  35.     @Pointcut(“@annotation(com.annotation.SystemServiceLog)”)  
  36.      public  void serviceAspect() {  
  37.     }  
  38.     //Controller层切点  
  39.     @Pointcut(“@annotation(com.annotation.SystemControllerLog)”)  
  40.      public  void controllerAspect() {  
  41.     }  
  42.     /** 
  43.      * 前置通告 用于拦截Controller层记录顾客的操作 
  44.      * 
  45.      * @param joinPoint 切点 
  46.      */  
  47.     @Before(“controllerAspect()”)  
  48.      public  void doBefore(JoinPoint joinPoint) {  
  49.         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();  
  50.         HttpSession session = request.getSession();  
  51.         //读取session中的客商  
  52.         User user = (User) session.getAttribute(WebConstants.CURRENT_USER);  
  53.         //请求的IP  
  54.         String ip = request.getRemoteAddr();  
  55.          try {  
  56.             //*========调控台出口=========*//  
  57.             System.out.println(“=====前置文告开始=====”);  
  58.             System.out.println(“恳求方法:”   (joinPoint.getTarget().getClass().getName()   ”.”   joinPoint.getSignature().getName()   ”()”));  
  59.             System.out.println(“方法描述:”   getControllerMethodDescription(joinPoint));  
  60.             System.out.println(“请求人:”   user.getName());  
  61.             System.out.println(“请求IP:”   ip);  
  62.             //*========数据库日志=========*//  
  63.             Log log = SpringContextHolder.getBean(“logxx”);  
  64.             log.setDescription(getControllerMethodDescription(joinPoint));  
  65.             log.setMethod((joinPoint.getTarget().getClass().getName()   ”.”   joinPoint.getSignature().getName()   ”()”));  
  66.             log.setType(“0″);  
  67.             log.setRequestIp(ip);  
  68.             log.setExceptionCode( null);  
  69.             log.setExceptionDetail( null);  
  70.             log.setParams( null);  
  71.             log.setCreateBy(user);  
  72.             log.setCreateDate(DateUtil.getCurrentDate());  
  73.             //保存数据库  
  74.             logService.add(log);  
  75.             System.out.println(“=====前置公告终止=====”);  
  76.         }  catch (Exception e) {  
  77.             //记录本地格外日志  
  78.             logger.error(“==后置文告非常==”);  
  79.             logger.error(“卓殊消息:{}”, e.getMessage());  
  80.         }  
  81.     }  
  82.     /** 
  83.      * 格外公告 用于拦截service层记录特别日志 
  84.      * 
  85.      * @param joinPoint 
  86.      * @param e 
  87.      */  
  88.     @AfterThrowing(pointcut = ”serviceAspect()”, throwing = ”e”)  
  89.      public  void doAfterThrowing(JoinPoint joinPoint, Throwable e) {  
  90.         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();  
  91.         HttpSession session = request.getSession();  
  92.         //读取session中的客户  
  93.         User user = (User) session.getAttribute(WebConstants.CURRENT_USER);  
  94.         //获取乞求ip  
  95.         String ip = request.getRemoteAddr();  
  96.         //获取顾客诉求方法的参数并种类化为JSON格式字符串  
  97.         String params = ”";  
  98.          if (joinPoint.getArgs() !=  null && joinPoint.getArgs().length > 0) {  
  99.              for ( int i = 0; i < joinPoint.getArgs().length; i ) {  
  100.                 params  = JSONUtil.toJsonString(joinPoint.getArgs()[i])   ”;”;  
  101.             }  
  102.         }  
  103.          try {  
  104.               /*========调控台出口=========*/  
  105.             System.out.println(“=====相当文告在此以前=====”);  
  106.             System.out.println(“至极代码:”   e.getClass().getName());  
  107.             System.out.println(“分外新闻:”   e.getMessage());  
  108.             System.out.println(“万分方法:”   (joinPoint.getTarget().getClass().getName()   ”.”   joinPoint.getSignature().getName()   ”()”));  
  109.             System.out.println(“方法描述:”   getServiceMthodDescription(joinPoint));  
  110.             System.out.println(“请求人:”   user.getName());  
  111.             System.out.println(“请求IP:”   ip);  
  112.             System.out.println(“需要参数:”   params);  
  113.                /*==========数据库日志=========*/  
  114.             Log log = SpringContextHolder.getBean(“logxx”);  
  115.             log.setDescription(getServiceMthodDescription(joinPoint));  
  116.             log.setExceptionCode(e.getClass().getName());  
  117.             log.setType(“1″);  
  118.             log.setExceptionDetail(e.getMessage());  
  119.             log.setMethod((joinPoint.getTarget().getClass().getName()   ”.”   joinPoint.getSignature().getName()   ”()”));  
  120.             log.setParams(params);  
  121.             log.setCreateBy(user);  
  122.             log.setCreateDate(DateUtil.getCurrentDate());  
  123.             log.setRequestIp(ip);  
  124.             //保存数据库  
  125.             logService.add(log);  
  126.             System.out.println(“=====格外通告终止=====”);  
  127.         }  catch (Exception ex) {  
  128.             //记录本地格外日志  
  129.             logger.error(“==非常公告非常==”);  
  130.             logger.error(“分外消息:{}”, ex.getMessage());  
  131.         }  
  132.          /*==========记录本地非常日志==========*/  
  133.         logger.error(“异常方法:{}相当代码:{}非常音讯:{}参数:{}”, joinPoint.getTarget().getClass().getName()   joinPoint.getSignature().getName(), e.getClass().getName(), e.getMessage(), params);  
  134.     }  
  135.     /** 
  136.      * 获取申明中对章程的汇报音讯 用于service层表明 
  137.      * 
  138.      * @param joinPoint 切点 
  139.      * @return 方法描述 
  140.      * @throws Exception 
  141.      */  
  142.      public  static String getServiceMthodDescription(JoinPoint joinPoint)  
  143.              throws Exception {  
  144.         String targetName = joinPoint.getTarget().getClass().getName();  
  145.         String methodName = joinPoint.getSignature().getName();  
  146.         Object[] arguments = joinPoint.getArgs();  
  147.         Class targetClass = Class.forName(targetName);  
  148.         Method[] methods = targetClass.getMethods();  
  149.         String description = ”";  
  150.          for (Method method : methods) {  
  151.              if (method.getName().equals(methodName)) {  
  152.                 Class[] clazzs = method.getParameterTypes();  
  153.                  if (clazzs.length == arguments.length) {  
  154.                     description = method.getAnnotation(SystemServiceLog. class).description();  
  155.                      break;  
  156.                 }  
  157.             }  
  158.         }  
  159.          return description;  
  160.     }  
  161.     /** 
  162.      * 获取注脚中对艺术的叙述消息 用于Controller层注明 
  163.      * 
  164.      * @param joinPoint 切点 
  165.      * @return 方法描述 
  166.      * @throws Exception 
  167.      */  
  168.      public  static String getControllerMethodDescription(JoinPoint joinPoint)  throws Exception {  
  169.         String targetName = joinPoint.getTarget().getClass().getName();  
  170.         String methodName = joinPoint.getSignature().getName();  
  171.         Object[] arguments = joinPoint.getArgs();  
  172.         Class targetClass = Class.forName(targetName);  
  173.         Method[] methods = targetClass.getMethods();  
  174.         String description = ”";  
  175.          for (Method method : methods) {  
  176.              if (method.getName().equals(methodName)) {  
  177.                 Class[] clazzs = method.getParameterTypes();  
  178.                  if (clazzs.length == arguments.length) {  
  179.                     description = method.getAnnotation(SystemControllerLog. class).description();  
  180.                      break;  
  181.                 }  
  182.             }  
  183.         }  
  184.          return description;  
  185.     }  
  186. }  

 

其三步把Controller的代办权交给cglib

在实例化ApplicationContext的时候必要加上

Xml代码 

[html] view plain copy

  1. <!– 运维对@AspectJ评释的支撑 –>  
  2. <aop:aspectj-autoproxy/>  

 

在调用Controller的时候AOP发挥效能所以在SpringMVC的配置文件里充足

Xml代码 

[html] view plain copy

  1. <!–布告spring使用cglib而不是jdk的来变化代理方法 AOP能够阻碍到Controller->  
  2. <aop:aspectj-autoproxy proxy-target-class=”true” />  

 

第四步使用

Controller层的使用

Java代码 

[java] view plain copy

  1. /** 
  2.     * 删除用户 
  3.     * 
  4.     * @param criteria 条件 
  5.     * @param id       id 
  6.     * @param model    模型 
  7.     * @return 数据列表 
  8.     */  
  9.    @RequestMapping(value = ”/delete”)  
  10.    //此处为记录AOP拦截Controller记录顾客操作  
  11.    @SystemControllerLog(description = ”删除客商”)  
  12.     public String del(Criteria criteria, String id, Model model, HttpSession session) {  
  13.         try {  
  14.            User user = (User) session.getAttribute(WebConstants.CURRENT_USER);  
  15.             if ( null != user) {  
  16.                 if (user.getId().equals(id)) {  
  17.                    msg = ”您不得以去除本身!”;  
  18.                    criteria = userService.selectByCriteriaPagination(criteria);  
  19.                }  else {  
  20.                    //删除数据并询问出多少  
  21.                    criteria = userService.delete(id, criteria);  
  22.                    msg = ”删除成功!”;  
  23.                }  
  24.            }  
  25.        }  catch (Exception e) {  
  26.            msg = ”删除败北!”;  
  27.        }  finally {  
  28.            model.addAttribute(“msg”, msg);  
  29.            model.addAttribute(“criteria”, criteria);  
  30.        }  
  31.        //跳转列表页  
  32.         return ”user/list”;  
  33.    }  

 

Service层的选用

Java代码 [java] view plain copy

  1. /** 
  2.     * 遵照分页查询 
  3.     * @param criteria 
  4.     * @return 
  5.     */  
  6.    //此处为AOP拦截Service记录特别新闻。方法无需加try-catch  
  7.    @SystemServiceLog(description = ”查询客商”)  
  8.     public Criteria<User> selectByCriteriaPagination(Criteria<User> criteria)  
  9.    {  
  10.        criteria.getList().get(0).getAccount();  
  11.        //查询总量  
  12.         long total=userMapper.countByCriteria(criteria);  
  13.        //设置总量  
  14.        criteria.setRowCount(total);  
  15.        criteria.setList(userMapper.selectByCriteriaPagination(criteria));  
  16.         return  criteria;  
  17.    }  

本文由365bet体育备用网址器发布于应用,转载请注明出处:前端请求拦截,Aop有的人说拦截不到Controller

关键词:

  • 上一篇:没有了
  • 下一篇:没有了