Maison >Java >javaDidacticiel >Interception et journalisation des opérations utilisateur - annotations personnalisées + explication de la technologie d'interception AOP
En tant qu'opérateur, en plus de traiter les problèmes de production du système, nous devons également gérer un grand nombre d'événements signalés par les utilisateurs. Cette partie du travail demande beaucoup de main d'œuvre. Par conséquent, envisagez de transformer une partie du traitement des requêtes d’événements en une plate-forme en libre-service pour permettre aux utilisateurs de vérifier et de traiter eux-mêmes. Il existe donc un système de libre-service pour les utilisateurs. Concernant la manière de mesurer la valeur de réalisation spécifique de cette plate-forme d'outils, des statistiques sur le fonctionnement des utilisateurs sont nécessaires pour fournir des données crédibles.
Ce qui précède constitue le contexte de cet article. L'architecture du système libre-service est la traditionnelle springmvc+spinrg+mybatis+oracle. La première chose qui vient à l’esprit lorsqu’on pense à la journalisation est le traitement d’interception AOP. Il existe de nombreux articles techniques connexes en ligne. Les problèmes rencontrés dans de petits projets simples peuvent généralement être résolus par Du Niang~(≧▽≦)/~
Annotation personnalisée :
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD)public @interface LogAnnotation { String operateModelName() default ""; String operateFuncName() default ""; String operationType() default ""; String operateDescribe() default ""; }
dans la référence de la couche contrôleur L'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(); } } }
ne publiera pas le code d'implémentation spécifique des autres couches de service liées à l'interrogation des informations d'enregistrement des utilisateurs.
Implémentation de l'intercepteur
@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"));} }
Ensuite, vous devez définir les paramètres d'interception dans le fichier de configuration :
Ajouter 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>
Mon contrôleur était à l'origine une injection de numérisation effectuée dans la configuration mvc, et le service était une injection de numérisation effectuée dans applicationContext.xml. Toutes les opérations visant à intercepter la couche de service peuvent être placées dans applicationContext.xml sous le réglage fin de la configuration ci-dessus.
Sortie du journal en arrière-plan après avoir appelé le .do
currentUser:renhuang targetName:com.bbc_kit.business.controller.QueryClientInfoController methodName:queryClientRegInfo operateModelName:用户注册模块 operateFuncName:queryClientRegInfo operationType:query operateDescribe:查询客户注册信息
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!