用户操作拦截并作日志记录--自定义注解+AOP拦截
作為運(yùn)營(yíng)除了處理系統(tǒng)生產(chǎn)問(wèn)題,還要處理大量的用戶(hù)上報(bào)事件,這部分工作占用了大量的人力。所有考慮把一部分事件查詢(xún)處理做成一個(gè)自助平臺(tái),讓用戶(hù)自行核查處理。于是就有了用戶(hù)自助系統(tǒng)。考慮到如何計(jì)量這個(gè)工具平臺(tái)具體的實(shí)現(xiàn)價(jià)值,需要做用戶(hù)操作統(tǒng)計(jì)才能給出可信服的數(shù)據(jù)。
以上就是本文的背景。自助系統(tǒng)的架構(gòu)就是傳統(tǒng)的springmvc+spinrg+mybatis+oracle。想到日志記錄首先想到的就是AOP攔截處理。網(wǎng)上相關(guān)的技術(shù)貼很多。簡(jiǎn)單的小項(xiàng)目遇到的問(wèn)題一般度娘都能給解決了~\(≧▽≦)/~
自定義注解:
@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 {@Resourceprivate IClientService clientService;private Logger logger = Logger.getLogger(this.getClass().getName());@RequestMapping(value="/queryClientRegInfo")@LogAnnotation(operateModelName="用戶(hù)注冊(cè)模塊",operateFuncName="queryClientRegInfo",operationType="query",operateDescribe="查詢(xún)客戶(hù)注冊(cè)信息")public void queryClientRegInfo(HttpServletRequest request,HttpServletResponse response){String client_idno = request.getParameter("idno");Client client = clientService.queryClientRegInfo(client_idno);//調(diào)用serviceSystem.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();} } }查詢(xún)用戶(hù)注冊(cè)信息相關(guān)其他的service層等具體實(shí)現(xiàn)代碼就不貼出來(lái)了。
攔截器的實(shí)現(xiàn)
@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")); } }接下來(lái)需要再配置文件中做攔截設(shè)置:
在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原來(lái)就是在mvc配置中做的掃描注入,service是在applicationContext.xml中做的掃描注入。所有要攔截service層的操作,可以把上面的配置微調(diào)下放置在applicationContext.xml中。
調(diào)用該.do后后臺(tái)日志輸出
currentUser:renhuangtargetName:com.bbc_kit.business.controller.QueryClientInfoController
methodName:queryClientRegInfo
operateModelName:用戶(hù)注冊(cè)模塊
operateFuncName:queryClientRegInfo
operationType:query
operateDescribe:查詢(xún)客戶(hù)注冊(cè)信息
?
轉(zhuǎn)載于:https://www.cnblogs.com/llspark/p/7044083.html
總結(jié)
以上是生活随笔為你收集整理的用户操作拦截并作日志记录--自定义注解+AOP拦截的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: centos上安装supervisor来
- 下一篇: 版本号控制-搭建gitserver