Maison  >  Article  >  Java  >  Interception et journalisation des opérations utilisateur - annotations personnalisées + explication de la technologie d'interception AOP

Interception et journalisation des opérations utilisateur - annotations personnalisées + explication de la technologie d'interception AOP

巴扎黑
巴扎黑original
2017-06-26 11:40:131602parcourir

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn