用戶操作攔截並作日志記錄--自定義注解+AOP攔截


作為運營除了處理系統生產問題,還要處理大量的用戶上報事件,這部分工作占用了大量的人力。所有考慮把一部分事件查詢處理做成一個自助平台,讓用戶自行核查處理。於是就有了用戶自助系統。考慮到如何計量這個工具平台具體的實現價值,需要做用戶操作統計才能給出可信服的數據。

以上就是本文的背景。自助系統的架構就是傳統的springmvc+spinrg+mybatis+oracle。想到日志記錄首先想到的就是AOP攔截處理。網上相關的技術貼很多。簡單的小項目遇到的問題一般度娘都能給解決了~\(≧▽≦)/~

自定義注解:

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

在controller層引用注解

@Controller
@RequestMapping(value="/kit")
public class QueryClientInfoController {
    @Resource
    private 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();
        }  
    }
}

查詢用戶注冊信息相關其他的service層等具體實現代碼就不貼出來了。

攔截器的實現

@Service(value="userLogService")
public class UserLogServiceImpl implements IUserLogService {
    @Resource
    private UserLogDao userLogDao;
    
    @Override
    public void insert(UserLog record) {
        return userLogDao.insert(record);
    }

    @Override
    public 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());
                    }else
                        break;
                    }
                }
             }
        } 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>

我的controller原來就是在mvc配置中做的掃描注入,service是在applicationContext.xml中做的掃描注入。所有要攔截service層的操作,可以把上面的配置微調下放置在applicationContext.xml中。

調用該.do后后台日志輸出

currentUser:renhuang 
targetName:com.bbc_kit.business.controller.QueryClientInfoController
methodName:queryClientRegInfo
operateModelName:用戶注冊模塊
operateFuncName:queryClientRegInfo
operationType:query
operateDescribe:查詢客戶注冊信息

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM