>  기사  >  Java  >  사용자 작업 차단 및 로깅 - 맞춤 주석 + AOP 차단 기술 설명

사용자 작업 차단 및 로깅 - 맞춤 주석 + AOP 차단 기술 설명

巴扎黑
巴扎黑원래의
2017-06-26 11:40:131559검색

운영자로서 우리는 시스템 생산 문제를 처리하는 것 외에도 사용자가 보고한 수많은 사건을 처리해야 하는 작업이기도 합니다. 따라서 이벤트 쿼리 및 처리의 일부를 셀프 서비스 플랫폼으로 전환하여 사용자가 직접 확인하고 처리할 수 있도록 하는 것을 고려해보세요. 그래서 사용자 셀프 서비스 시스템이 있습니다. 본 도구 플랫폼의 구체적인 실현 가치를 어떻게 측정할지 고려할 때, 설득력 있는 데이터를 제공하기 위해서는 사용자 운영 통계가 필요합니다.

위 내용이 이 글의 배경입니다. 셀프 서비스 시스템의 아키텍처는 전통적인 springmvc+spinrg+mybatis+oracle입니다. 로깅을 생각할 때 가장 먼저 떠오르는 것은 AOP 차단 처리이다. 온라인에는 관련 기술 게시물이 많이 있습니다. 간단한 소규모 프로젝트에서 발생하는 문제는 일반적으로 Du Niang~(≧▽DF)/~

사용자 정의 주석:

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

컨트롤러 레이어의 인용 주석

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

사용자 등록 정보 쿼리 관련 특정 다른 서비스 레이어의 구현 코드는 게시되지 않습니다.

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

다음으로 구성 파일에서 차단 설정을 지정해야 합니다.

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>

추가 내 컨트롤러는 mvc에서 수행된 스캔 주입으로 밝혀졌습니다. 구성, 서비스는 applicationContext.xml에서 수행되는 스캐닝 주입입니다. 서비스 계층을 가로채는 모든 작업은 위의 구성 미세 조정에 따라 applicationContext.xml에 배치될 수 있습니다.

.do

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

호출 후 백그라운드 로그 출력

위 내용은 사용자 작업 차단 및 로깅 - 맞춤 주석 + AOP 차단 기술 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.