三種方案實現日志記錄功能


                                                  三種方案實現日志記錄功能

方案一、使用攔截器實現日志記錄功能

步驟一、首先需要我們自定義一個注解類

 

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>

 

方案三、使用過濾器實現日志記錄

 

     


免責聲明!

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



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