三种方案实现日志记录功能
三种方案实现日志记录功能
方案一、使用拦截器实现日志记录功能
步骤一、首先需要我们自定义一个注解类
package cn.hmy.Util; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 自定义操作日志注解接口类 * @author Dream * */ //表示在什么级别保存该注解信息 @Retention(RetentionPolicy.RUNTIME) //表示该注解用于什么地方 @Target(ElementType.METHOD) public @interface OperateLog { //操作日志的内容 String content(); //模块名 String moduleName(); //操作类型 String operateType() default ""; //操作编号 String code() default ""; }
步骤二、在我们的action的方法上添加我们自定义的注解
// 判断用户是否成功登录 @OperateLog(moduleName="用户管理",operateType="登录",content="登录系统") public String login() throws Exception { // 获取所有用户信息 List<PsUser> findAll = service.findAll(); // 进行对比 for (PsUser ps_user : findAll) { if (model.getUserCode().equals(ps_user.getUserCode())) {// 登录账号相同 // 验证密码是否相同 if (model.getUserPassWord().equals(ps_user.getUserPassWord())) { // 将登录信息放入session ServletActionContext.getRequest().getSession() .setAttribute("loginuser", ps_user); // 查找当前用户的所有一级权限的集合 List<PsFunction> topFunctionByUid = functionService.getTopFunctionByUid(ps_user.getId().toString()); //查找该用户拥有的所有的权限集合 List<PsFunction> AllFunctionByUid = functionService.getAllFunctionByUid(ps_user.getId().toString()); //放入上下文 ActionContext.getContext().put("topFunctionByUid", topFunctionByUid); ActionContext.getContext().put("AllFunctionByUid", AllFunctionByUid); //登录成功之后,立即更新用户最后一次登录时间 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(sdf.format(new Date())); System.out.println(date); ps_user.setLastLoginTime(date); service.update(ps_user); return "login"; } } } return "input"; }
步骤三、定义日志记录的拦截器
package cn.hmy.intercepter; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts2.ServletActionContext; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.hmy.Util.OperateLog; import cn.hmy.Util.SpringContextHelper; import cn.hmy.base.BaseService; import cn.hmy.beans.PsLogs; import cn.hmy.beans.PsUser; import cn.hmy.service.PsLogsService; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class OperateLogIntercepter extends AbstractInterceptor{ private static final Log log=LogFactory.getLog(OperateLogIntercepter.class); /*=(PsLogsService) new PsLogsServiceImpl();*/ @Override public String intercept(ActionInvocation invocation) throws Exception { /*Object bean = SpringContextHelper.getBean("psLogsService");*/ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); PsLogsService bean = (PsLogsService)context.getBean("psLogsService"); System.out.println("日志拦截器已经开始启动"); Class<? extends Object> actionClass=invocation.getAction().getClass(); String methodName=invocation.getProxy().getMethod(); //获取当前方法 Method currentMethod=actionClass.getMethod(methodName); System.out.println("当前方法+++++++++++++=="+currentMethod); boolean flag = currentMethod.isAnnotationPresent(OperateLog.class); if(flag){ OperateLog ol=currentMethod.getAnnotation(OperateLog.class); System.out.println(ol.content()); PsLogs logs=new PsLogs(); PsUser user=(PsUser)ServletActionContext.getRequest().getSession().getAttribute("loginuser"); if(user==null){ String userCode = ServletActionContext.getRequest().getParameter("userCode"); String userPassWord= ServletActionContext.getRequest().getParameter("userPassWord"); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf.parse(sdf.format(new Date())); logs.setOperateInfo(ol.content()); logs.setOperatedatetime(date); logs.setUserCode(userCode); ((BaseService<PsLogs>) bean).save(logs); }else{ SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf.parse(sdf.format(new Date())); logs.setOperateInfo(ol.content()); logs.setOperatedatetime(date); logs.setUserCode(user.getUserCode()); logs.setUserName(user.getUserName()); ((BaseService<PsLogs>) bean).save(logs); } } return invocation.invoke(); } public static Log getLog() { return log; } }
步骤四、在struts.xml文件中 配置我们的拦截器
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.ui.theme" value="simple"></constant> <constant name="struts.devMode" value="false"></constant> <constant name="struts.enable.DynamicMethodInvocation" value="true"/> <package name="default" namespace="/" extends="struts-default"> <!--拦截器 --> <interceptors> <!--声明拦截器 --> <!--权限设置拦截器 --> <interceptor name="checkPrivilege" class="cn.hmy.intercepter.CheckPrivilegeIntercepter"></interceptor> <!--操作日志的拦截器 --> <interceptor name="operateLogIntercepter" class="cn.hmy.intercepter.OperateLogIntercepter"></interceptor> <!--配置一个拦截器栈 --> <interceptor-stack name="mystack"> <interceptor-ref name="checkPrivilege"></interceptor-ref> <interceptor-ref name="operateLogIntercepter"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!--默认使用这个拦截器栈 --> <default-interceptor-ref name="mystack"></default-interceptor-ref> <!--配置全局的result配置 --> <global-results> <result name="loginUI">/jsp/login.jsp</result> <result name="noPrivilegeError">/noPrivilegeError.jsp</result> </global-results> </package> <include file="cn/hmy/action/Ps_userAction.xml"></include> <include file="cn/hmy/action/Ps_FunctionAction.xml"></include> <include file="cn/hmy/action/Ps_roleAction.xml"></include> <include file="cn/hmy/action/Ps_LogsAction.xml"></include> </struts>
方案二、使用aop实现日志记录
步骤一、定义自定义的注解类
package cn.hmy.Util; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 自定义操作日志注解接口类 * @author Dream * */ //表示在什么级别保存该注解信息 @Retention(RetentionPolicy.RUNTIME) //表示该注解用于什么地方 @Target(ElementType.METHOD) public @interface OperateLog { //操作日志的内容 String content(); //模块名 String moduleName(); //操作类型 String operateType() default ""; //操作编号 String code() default ""; }
步骤二、定义方法的前置增强
package cn.hmy.advicer; import java.lang.reflect.Method; import java.util.Date; import org.apache.struts2.ServletActionContext; import org.springframework.aop.MethodBeforeAdvice; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.hmy.Util.OperateLog; import cn.hmy.beans.PsLogs; import cn.hmy.beans.PsUser; import cn.hmy.service.PsLogsService; public class LogBeforeAdvice implements MethodBeforeAdvice{ public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("日志记录开启"); OperateLog annotation=method.getAnnotation(OperateLog.class); if(annotation!=null){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); PsLogsService service = (PsLogsService)context.getBean("psLogsService"); //获取session中用户的信息 PsUser user=(PsUser)ServletActionContext.getRequest().getSession().getAttribute("loginuser"); PsLogs logs=new PsLogs(); logs.setOperatedatetime(new Date()); logs.setOperateInfo(annotation.content()); if(user==null){ String userCode = ServletActionContext.getRequest().getParameter("userCode"); String userPassWord= ServletActionContext.getRequest().getParameter("userPassWord"); logs.setUserCode(userCode); }else{ logs.setUserCode(user.getUserCode()); logs.setUserName(user.getUserName()); } service.save(logs); } } }
步骤三、在applicationContext.xml文件中配置
<!--aop log cfg 自动代理 --> <bean name="logBefore" class="cn.hmy.advicer.LogBeforeAdvice"></bean> <aop:config proxy-target-class="true"> <aop:pointcut expression="execution(* *..action.*.*(..))" id="pointcut"/> <aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/> </aop:config>
方案三、使用过滤器实现日志记录