Heim  >  Artikel  >  Java  >  Abfangen und Protokollieren von Benutzervorgängen – benutzerdefinierte Anmerkungen + Erläuterung der AOP-Abfangtechnologie

Abfangen und Protokollieren von Benutzervorgängen – benutzerdefinierte Anmerkungen + Erläuterung der AOP-Abfangtechnologie

巴扎黑
巴扎黑Original
2017-06-26 11:40:131556Durchsuche

Als Betreiber müssen wir uns nicht nur mit Systemproduktionsproblemen befassen, sondern auch mit einer großen Anzahl von Benutzern gemeldeter Ereignisse. Dieser Teil der Arbeit nimmt viel Arbeitskraft in Anspruch. Erwägen Sie daher, einen Teil der Ereignisabfrageverarbeitung in eine Self-Service-Plattform umzuwandeln, damit Benutzer selbst prüfen und verarbeiten können. Es gibt also ein Benutzer-Selbstbedienungssystem. Um den spezifischen Realisierungswert dieser Tool-Plattform zu messen, sind Benutzerbetriebsstatistiken erforderlich, um glaubwürdige Daten bereitzustellen.

Das Obige ist der Hintergrund dieses Artikels. Die Architektur des Selbstbedienungssystems ist das traditionelle SpringMVC+Spinrg+Mybatis+Oracle. Wenn man an Protokollierung denkt, denkt man als Erstes an die AOP-Abfangverarbeitung. Es gibt viele verwandte technische Beiträge online. Probleme, die bei einfachen kleinen Projekten auftreten, können normalerweise durch Du Niang~(≧▽≦)/~

Benutzerdefinierte Annotation:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)public @interface LogAnnotation {
    String operateModelName() default "";
    String operateFuncName() default "";
    String operationType() default "";  
    String operateDescribe() default "";
}

in der Controller-Layer-Referenz gelöst werden Anmerkung

@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();
        }  
    }
}

veröffentlicht nicht den spezifischen Implementierungscode anderer Dienstschichten im Zusammenhang mit der Abfrage von Benutzerregistrierungsinformationen.

Implementierung des Interceptors

@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"));}
}

Als nächstes müssen Sie Abfangeinstellungen in der Konfigurationsdatei vornehmen:

In spring-mvc.xml hinzufügen

<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>

Mein Controller war ursprünglich eine Scan-Injection, die in der MVC-Konfiguration durchgeführt wurde, und der Dienst war eine Scan-Injection, die in applicationContext.xml durchgeführt wurde. Alle Vorgänge zum Abfangen der Serviceschicht können unter der oben genannten Feinabstimmung der Konfiguration in applicationContext.xml platziert werden.

Hintergrundprotokollausgabe nach Aufruf der .do

currentUser:renhuang 
targetName:com.bbc_kit.business.controller.QueryClientInfoController 
methodName:queryClientRegInfo 
operateModelName:用户注册模块 
operateFuncName:queryClientRegInfo 
operationType:query 
operateDescribe:查询客户注册信息

Das obige ist der detaillierte Inhalt vonAbfangen und Protokollieren von Benutzervorgängen – benutzerdefinierte Anmerkungen + Erläuterung der AOP-Abfangtechnologie. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn