三種方案實現日志記錄功能
方案一、使用攔截器實現日志記錄功能
步驟一、首先需要我們自定義一個注解類
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>
方案三、使用過濾器實現日志記錄