As an operator, in addition to dealing with system production problems, we also need to deal with a large number of user-reported events. This part of the work takes up a lot of manpower. Therefore, consider turning part of the event query processing into a self-service platform to allow users to check and process by themselves. So there is a user self-service system. Considering how to measure the specific realization value of this tool platform, user operation statistics are needed to provide credible data.
The above is the background of this article. The architecture of the self-service system is the traditional springmvc+spinrg+mybatis+oracle. The first thing that comes to mind when thinking of logging is AOP interception processing. There are many related technical posts online. Problems encountered in simple small projects can generally be solved by Du Niang~\(≧▽≦)/~
Custom annotation:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD)public @interface LogAnnotation { String operateModelName() default ""; String operateFuncName() default ""; String operationType() default ""; String operateDescribe() default ""; }
in the controller Layer reference annotation
@Controller @RequestMapping(value="/kit")public class QueryClientInfoController { @Resourceprivate IClientService clientService; private Logger logger = Logger.getLogger(this.getClass().getName()); @RequestMapping(value="/queryClientRegInfo") @LogAnnotation(operateModelName="用户注册模块", operateFuncName="queryClientRegInfo", operationType="query", operateDescribe="查询客户注册信息")public void queryClientRegInfo(HttpServletRequest request,HttpServletResponse response){ String client_idno = request.getParameter("idno");Client client = clientService.queryClientRegInfo(client_idno);//调用service System.out.println("queryClientRegInfo:"+client.getName()); String jsonMap = JSON.toJSONString(client); response.setCharacterEncoding("UTF-8");try { response.getWriter().write(jsonMap); response.getWriter().flush(); response.getWriter().close(); } catch (IOException e) { e.printStackTrace(); } } }
The specific implementation code of other service layers related to querying user registration information will not be posted.
Implementation of interceptor
@Service(value="userLogService")public class UserLogServiceImpl implements IUserLogService { @Resourceprivate UserLogDao userLogDao; @Overridepublic void insert(UserLog record) {return userLogDao.insert(record); }@Overridepublic void logBusiController(JoinPoint joinPoint) { Map<String, Object> map = new HashMap<String, Object>(); String targetName = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); Object[] arguments = joinPoint.getArgs(); Class targetClass;try { targetClass = Class.forName(targetName); Method[] methods = targetClass.getMethods();for (Method method : methods) {if(method.getName().equals(methodName)) { Class[] clazzs = method.getParameterTypes();if(clazzs.length == arguments.length ) {if(method.getAnnotation(LogAnnotation.class)!= null){ map.put("operateModelName", method.getAnnotation(LogAnnotation.class).operateModelName()); map.put("operateFuncName", method.getAnnotation(LogAnnotation.class).operateFuncName()); map.put("operationType", method.getAnnotation(LogAnnotation.class).operationType()); map.put("operateDescribe", method.getAnnotation(LogAnnotation.class).operateDescribe()); }elsebreak; } } } } catch (ClassNotFoundException e) { e.printStackTrace(); } HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpSession session =request.getSession(); User user = (User) session.getAttribute("currentUser"); System.out.println("currentUser:"+user.getName()+"\n targetName:"+targetName+"\n methodName:"+methodName+"\n operateModelName:"+map.get("operateModelName")+"\n operateFuncName:"+map.get("operateFuncName")+"\n operationType:"+map.get("operationType")+"\n operateDescribe:"+map.get("operateDescribe"));} }
Next, you need to make interception settings in the configuration file:
Add ## to spring-mvc.xml
#<bean id="LogService" class="com.bbc_kit.common.service.impl.UserLogServiceImpl"></bean> <aop:config> <aop:pointcut id="logBusiControllerPoint" expression="execution(* com.bbc_kit.business.controller..*.*(..))" /> <aop:aspect id="logService" ref="LogService"> <aop:after pointcut-ref="logBusiControllerPoint" method="logBusiController"/> </aop:aspect> </aop:config>My controller was originally a scanning injection done in the mvc configuration, and the service was a scanning injection done in applicationContext.xml. All operations to intercept the service layer can be placed in applicationContext.xml under the above configuration fine-tuning. Background log output after calling the .do
currentUser:renhuang targetName:com.bbc_kit.business.controller.QueryClientInfoController methodName:queryClientRegInfo operateModelName:用户注册模块 operateFuncName:queryClientRegInfo operationType:query operateDescribe:查询客户注册信息
The above is the detailed content of User operation interception and logging - Custom annotations + AOP interception technology explanation. For more information, please follow other related articles on the PHP Chinese website!