1. 程式人生 > >SSM使用AOP切面獲取使用者登入操作日誌

SSM使用AOP切面獲取使用者登入操作日誌

系統日誌類 SysLog.java:

package com.ys.entity;

import java.sql.Timestamp;

import com.fasterxml.jackson.annotation.JsonFormat;

/**
 * 系統日誌
 * @author Administrator
 *
 */
public class SysLog {

    private int id;//id
    private int user_id;//使用者id
    private Timestamp createDate;//新建時間
    private String operation;//操作
private String content;//內容 private String ipAddress;//ip private String name;//使用者名稱 private String role_name;//角色 public int getId() { return id; } public void setId(int id) { this.id = id; } public int getUser_id() { return user_id; } public
void setUser_id(int user_id) { this.user_id = user_id; } @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8") public Timestamp getCreateDate() { return createDate; } public void setCreateDate(Timestamp createDate) { this.createDate = createDate; } public
String getOperation() { return operation; } public void setOperation(String operation) { this.operation = operation; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRole_name() { return role_name; } public void setRole_name(String role_name) { this.role_name = role_name; } public String getIpAddress() { return ipAddress; } public void setIpAddress(String ipAddress) { this.ipAddress = ipAddress; } }

系統日誌方法 SysLogMapper.java:

package com.ys.mapper;


import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import com.ys.entity.SysLog;

@Repository
public interface SysLogMapper {

    /**
     * 查詢所有的系統日誌
     * @return
     */
    @Select("select u.name,r.role_name,s.id,s.createdate,s.operation,s.ipAddress,s.content from sys_syslog s left join sys_user u on s.user_id=u.user_id left join sys_role r on r.role_id=u.role_id order by s.createdate desc")
    List<SysLog> queryAllSysLog();

    /**
     * 新增系統日誌
     * @param syslog
     * @return
     */
    @Insert("insert into sys_syslog (user_id,createDate,operation,content,ipAddress) values(#{user_id},#{createDate},#{operation},#{content},#{ipAddress})")
    int addSysLog(SysLog syslog);

    /**
     * 刪除系統日誌
     * @param id
     * @return
     */
    @Delete("delete from sys_syslog where id=#{id}")
    int deleteSysLog(int id);
}

系統日誌控制層SysLogController.java:

package com.ys.controller;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.ys.entity.SysLog;
import com.ys.service.SysLogService;

/**
 * 系統日誌 controller
 * @author Administrator
 *
 */
@Controller
public class SysLogController {

    @Autowired
    private SysLogService service;


    /**
     * 跳轉到日誌列表頁
     * @return
     */
    @RequestMapping(value="sysLogListInput")
    public String sysLogListInput(){
        return "sysLogList";
    }

    /**
     * 獲取日誌列表資料
     * @return
     */
    @RequestMapping(value="queryAllSysLogData",method=RequestMethod.POST)
    @ResponseBody
    public List<SysLog> queryAllSysLogData(){
        return service.queryAllSysLog();
    }

    /**
     * 刪除日誌
     * @param data
     * @return
     */
    @RequestMapping(value="deleteSysLogData",method=RequestMethod.POST)
    @ResponseBody
    public Map<String,Object> deleteSysLogData(String data){
        return service.deleteSysLog(data);
    }

}

切面類 SysLogAop.java: (切點為登入、增、刪、改方法, 這裡去除系統日誌的所有方法)

package com.ys.aop;

import java.net.InetAddress;
import java.util.Map;


import org.aspectj.lang.JoinPoint;  
import org.aspectj.lang.annotation.AfterReturning;  
import org.aspectj.lang.annotation.Aspect;  
import org.aspectj.lang.annotation.Pointcut;  
import org.springframework.beans.factory.annotation.Autowired;

import com.ys.entity.SysLog;
import com.ys.entity.User;
import com.ys.service.SysLogService;
import com.ys.utils.DateUtils;  

@Aspect  
public class SysLogAop {  

    public Integer id=null;   
    public static User u=new User();  
    @Autowired  
    SysLogService service;  

    /** 
     * 管理員登入方法的切入點 
     */  
    @Pointcut("execution(* com.ys.service.*.loginValid(..))")  
    public void loginCell(){  
    }  

    /** 
     * 新增業務邏輯方法切入點    去除日誌的所有方法
     */ 
    @Pointcut("execution(* com.ys.service.*.add*(..)) && !execution(* com.ys.service.SysLogService.*(..))")  
    public void insertCell() {  
    }  

    /** 
     * 修改業務邏輯方法切入點 
     */  
    @Pointcut("execution(* com.ys.service.*.update*(..)) && !execution(* com.ys.service.SysLogService.*(..))")  
    public void updateCell() {  
    }  

    /** 
     * 刪除業務邏輯方法切入點 
     */  
    @Pointcut("execution(* com.ys.service.*.delete*(..)) && !execution(* com.ys.service.SysLogService.*(..))")  
    public void deleteCell() {  
    }  

    /**
     * 獲取使用者登入成功傳過來的user值
     * @param user
     * @return
     */
    public static User getUser(User user){
        u=user;
        return u;
    }


    /** 
     * 登入操作(後置通知) 
     * @param joinPoint 
     * @param object 
     * @throws Throwable 
     */  
    @AfterReturning(value = "loginCell()", argNames = "object", returning = "object")  
    public void loginLog(JoinPoint joinPoint, Object object) throws Throwable {  
        @SuppressWarnings("unchecked")
        //獲取service登入執行後的引數  這裡返回map
        Map<String, Object> map=(Map<String, Object>) object; 
        System.out.println(map);
        if (map.get("status")=="error") {  
            return;  
        }  
        if (joinPoint.getArgs() == null) {// 沒有引數  
            return;  
        }  
        id=u.getUser_id();

        SysLog syslog=new SysLog();
        syslog.setContent(opContent(joinPoint));  
        syslog.setUser_id(id);
        syslog.setCreateDate(DateUtils.getTimestamp());  
        syslog.setOperation("登入"); 
        //PC-20170215CNRU/192.168.1.104擷取為192.168.1.104
        syslog.setIpAddress(InetAddress.getLocalHost().toString().substring(InetAddress.getLocalHost().toString().lastIndexOf("/")+1));
        service.addSysLog(syslog); 
    }  

    /** 
     * 新增操作日誌(後置通知) 
     *  
     * @param joinPoint 
     * @param object 
     */  
    @AfterReturning(value = "insertCell()", argNames = "object", returning = "object")  
    public void insertLog(JoinPoint joinPoint, Object object) throws Throwable {  
        // 判斷引數  
        if (joinPoint.getArgs() == null) {// 沒有引數  
            return;  
        }  

        SysLog syslog=new SysLog();
        syslog.setContent(opContent(joinPoint));  
        syslog.setUser_id(id);  
        syslog.setCreateDate(DateUtils.getTimestamp());  
        syslog.setOperation("新增");  
        syslog.setIpAddress(InetAddress.getLocalHost().toString().substring(InetAddress.getLocalHost().toString().lastIndexOf("/")+1));
        service.addSysLog(syslog);  
    }  

    /** 
     * 管理員修改操作日誌(後置通知) 
     *  
     * @param joinPoint 
     * @param object 
     * @throws Throwable 
     */  
    @AfterReturning(value = "updateCell()", argNames = "object", returning = "object")  
    public void updateLog(JoinPoint joinPoint, Object object) throws Throwable {  
        // 判斷引數  
        if (joinPoint.getArgs() == null) {// 沒有引數  
            return;  
        }  

        // 建立日誌物件  
        SysLog syslog=new SysLog();
        syslog.setContent(opContent(joinPoint));  
        syslog.setUser_id(id);  
        syslog.setCreateDate(DateUtils.getTimestamp());  
        syslog.setOperation("修改");  
        syslog.setIpAddress(InetAddress.getLocalHost().toString().substring(InetAddress.getLocalHost().toString().lastIndexOf("/")+1));
        service.addSysLog(syslog); 
    }  

    /** 
     * 刪除操作 
     *  
     * @param joinPoint 
     * @param object 
     */  
    @AfterReturning(value = "deleteCell()", argNames = "object", returning = "object")  
    public void deleteLog(JoinPoint joinPoint, Object object) throws Throwable {  
        if (joinPoint.getArgs() == null) {// 沒有引數  
            return;  
        }  

        // 建立日誌物件  
        SysLog syslog=new SysLog();
        syslog.setContent(opContent(joinPoint));  
        syslog.setUser_id(id);  
        syslog.setCreateDate(DateUtils.getTimestamp());  
        syslog.setOperation("刪除");  
        syslog.setIpAddress(InetAddress.getLocalHost().toString().substring(InetAddress.getLocalHost().toString().lastIndexOf("/")+1));
        service.addSysLog(syslog);
    }  

   /**
    * 獲取執行的操作的資訊 
    * @param joinPoint
    * @return
    */
    public String opContent(JoinPoint joinPoint){
        //獲取類名
        String className=joinPoint.getTarget().getClass().getName();
        //獲取方法名
        String methodName = joinPoint.getSignature().getName();
        String str="執行了"+className+"類的"+methodName+"方法";
        return str;
    }




}

這裡的登入操作是後臺驗證的時候傳過來使用者id。

使用者登入 UserService:

/**
     * 驗證登入
     * @param login_name
     * @param login_password
     * @param request
     * @return
     */
    public Map<String, Object> loginValid(String username,String password,HttpServletRequest request){
        User user=mapper.queryByUsernameAndPassword(username, password);
        Map<String, Object> map=new HashMap<>();
        if(user==null||"".equals(user)){
            map.put("status", "error");
            map.put("msg", "使用者名稱或密碼錯誤!");
        }else if(user!=null&&!"".equals(user.getUser_id())){
            SysLogAop.getUser(user);
            map.put("status", "ok");
            map.put("msg", "登入成功!");
            request.getSession().setAttribute("user", user);
            request.getSession().setMaxInactiveInterval(30*60);//session超時30min
        }
        return map;
    }

另外還需要修改springMVC配置檔案:
引入AOP的名稱空間:

<beans xmlns="
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
    ">

掃描切面類位置:

<!-- 日誌 -->  
<aop:aspectj-autoproxy />  
<bean id="logBean" class="com.ys.aop.SysLogAop"></bean> 

然後是系統日誌的JSP頁面 sysLogList.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ include file="common.jsp"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>OA-系統日誌</title>
<link type="text/css" rel="stylesheet" href="${ctxStatic}/bootstrap/css/bootstrap.min.css"/>
<link type="text/css" rel="stylesheet" href="${ctxStatic}/bootstrap/css/bootstrap-table.css">
<!-- 匯入jQuery  -->
<script type="text/javascript" src="${ctxStatic}/jquery/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="${ctxStatic}/bootstrap/js/bootstrap.js"></script>
<script type="text/javascript" src="${ctxStatic}/bootstrap/js/bootstrap-table.js"></script>
<script type="text/javascript" src="${ctxStatic}/bootstrap/js/bootstrap-table-zh-CN.js"></script>
<!-- 匯入layer -->
<script type="text/javascript" src="${ctxStatic}/layer/layer.js"></script>

</head>
<body>
<div id="toolbar" class="btn-group">
<a class="btn btn-default" href="javascript:del();" role="button"><i class="fa fa-trash">刪除</i></a>
</div>
<table id="screenTable" ></table>
</body>
<script type="text/javascript">

            //設定載入效果
            var index = layer.load(2, {
                      shade: [0.1,'#fff'] //0.1透明度的白色背景
                    });
            $('#screenTable').bootstrapTable({
            method:'post',
            url: "${ctx}/queryAllSysLogData",
            dataType:'json',
            toolbar:'#toolbar',
            cache: false, //不使用快取
            striped: true, //顯示行間隔色
            pagination: true, //顯示分頁
            pageSize: 20, //每頁的行數
            pageList: [10, 20], //自定義每頁的行數
            search: true, //顯示錶格搜尋
            showRefresh: true, //重新整理按鈕
            showToggle: true,
            showExport: true,    //是否顯示匯出
            showColumns:true,
            columns: [{
            field: "checked",
            checkbox: true,
            align: "center",
            valign: "middle"
            },{
            field: "name",
            title: "姓名",
            align: "center",
            valign: "middle"
            }, {
            field: "role_name",
            title: "角色名稱",
            align: "center",
            valign: "middle"
            }, {
            field: "createDate",
            title: "操作時間",
            align: "center",
            valign: "middle"
            }, {
            field: "operation",
            title: "操作型別",
            align: "center",
            valign: "middle"
            }, {
            field: "content",
            title: "操作內容",
            align: "center",
            valign: "middle"
            }, {
            field: "ipAddress",
            title: "IP地址",
            align: "center",
            valign: "middle"
            }],
            formatNoMatches: function () {
            return '無符合條件的記錄';
            }
            });
            layer.close(index);
</script>
<script type="text/javascript">
    function del(){
        var checkData=$('#screenTable').bootstrapTable('getSelections');
        if(checkData.length<1){
            layer.msg("請選擇要刪除的資料!",{icon:7,shift:6,time:1000});
        }else{
            var data="";
            for(var i=0;i<checkData.length;i++){
                data+=checkData[i].id+",";
            }
            layer.confirm('是否要刪除選中資料?', {
                  icon:3,       
                  title:'提示!',
                  btn: ['是','否'] //按鈕
                }, function(){
                    $.ajax({
                        method:'post',
                        url:'${ctx}/deleteSysLogData',
                        data:{data:data},
                        dataType:'json',
                        success:function(ret){
                            if(ret.status=="ok"){
                                layer.msg(ret.msg,{time:500,icon:1});
                                setTimeout(function(){ location.href='${ctx}/sysLogListInput'; },500);
                            }else if(ret.status=="error"){
                                layer.msg(ret.msg,{time:500,icon:7});
                            }
                        },
                        error:function(ret){
                            layer.msg("請求異常!錯誤程式碼:"+ret.status,{time:2000,icon:7});
                        }
                    })
                }, function(){
                      layer.msg('操作取消!', 
                        {time:500,
                        icon: 5}
                      );
                    });
        }



    }
</script>
</html>

這裡使用bootStrap-Table顯示列表,layer訊息彈框。頁面如下:

這裡寫圖片描述

獲取使用者的登入增刪改操作資訊。

相關推薦

SSM使用AOP切面獲取使用者登入操作日誌

系統日誌類 SysLog.java: package com.ys.entity; import java.sql.Timestamp; import com.fasterxml.jackson.annotation.JsonFormat; /**

Springboot 如何使用AOP同時織入多個切面?實現使用者 操作日誌記錄功能

首先匯入AOP的pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-sta

spring配置日誌切面,實現系統操作日誌記錄

//做系統是經常會遇到的情況之一,對系統操作日誌存表記錄 下面給出下例子 需要注意的是,日誌通常資料量會很大,建議已每個人月一張表,或者其他方式分表 例如:logs_2012_1             logs_2012_2             logs_2012_

Springboot 自定義註解 AOP切面獲取操作日誌

編碼思想: 新增和修改資料,記錄使用者操作資訊(建立人,修改人) ,然後每個模組打算根據操作資料的主鍵id關聯日誌表查詢操作人資訊;需要宣告每個模組名稱及操作方法(constant包中便是宣告的模組和操作方法列舉) 檔案目錄: 1. build.gradle引入jar

後臺操作日誌,插入數據獲取的該數據主鍵ID為null

com sele ride model 不能 new t void sid sel 代碼如下: @Override public void saveTopicResource(TopicResourceModel model, Integer userId) {

微信小程式獲取使用者的操作軌跡日誌

花費了兩天時間,修改過數次,終於把這個功能封裝成了一個獨立的工具。 任何小程式都可在不修改原始碼的情況下直接鑲入使用!!! 步驟: 1. 在小程式 app.js 的平級目錄建立一個 js , 命名為 userTrajectory.js。點選下載  userTr

登入IP記錄Linux所有使用者操作日誌

PS1="`whoami`@`hostname`:"'[$PWD]' history USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'` if [ "$USER_IP" = "" ] then USER_IP=`

基於SSM利用SpringAOP切面及自定義註解 記錄每次操作記錄(操作日誌 同理)

前段時間根據業務需求要記錄每次操作時的相關資訊:本帖方式通過在SpringMVC中的Controller設定一個自定義註解類來進行對資料的接收,通過 SpringAOP切面來對接收的資料進行邏輯處理. 在事先根據業務需求建立的一個實體類(如: UploadCount)的基礎

通過SpringAOP獲取request中所有引數,記錄使用者操作日誌

今天搞了一個AOP的管理日誌,蛋疼的很....老規矩貼程式碼吧 首先除了aop的包以外需要這三個包。自行度娘。(如果想切入controllers,請將這個程式碼寫入你的mvc配置中,糾結了一上午切不進去就是這個原因.)(method為你切入類的方法名 )可以照這個打個模版出來

ThreadLocal 在記錄操作日誌中的應用

boolean bsp cti @override long med span 字段 中文   ThreadLocal,很多地方叫做線程本地變量,也有些地方叫做線程本地存儲,其實意思差不多。可能很多朋友都知道ThreadLocal為變量在每個線程中都創建了一個副本,那麽每

Cookie的存儲、獲取、刪除操作

.get expires get string -1 urn pre var win var Cookie={ set: function (name, value, days) { var d = new Date; d.se

mysql 選取操作日誌(mysql-bin.0000恢復數據)

com boa .cn ini 啟用 分享 時間段 結束時間 開始 my.ini 配置log-bin=mysql-bin 啟用日誌 用 mysql-bin.0000 mysqlbinlog -d keyboard ../data/mysql-bin.000024

SecureCrt配置之自動存儲操作日誌

secure crt 日誌 日誌自動存儲配置我填寫的log file name D:\SecureCrt-log\%H\%Y%M%D\%S %H %Y-%M-%D %h%m%s.log防止連接中斷配置每300秒會在命令窗口自動輸入一個空格,也就每300秒會向目標服務器發送一個空格指令,防止連接

java springMVC SSM 操作日誌 4級別聯動 文件管理 頭像編輯 shiro redis

java 下拉聯動 頭像裁剪 圖片裁剪 springmvc 官網 http://www.fhadmin.org/ A代碼編輯器,在線模版編輯,仿開發工具編輯器,pdf在線預覽,文件轉換編碼 B 集成代碼生成器 [正反雙向](單表、主表、明細表、樹形表,快速開發利器)+快速表單構

生成系統操作日誌

系統操作日誌系統操作日誌作用:主要是為了記錄登錄到系統中的人什麽時間對什麽模塊的某條數據進行了操作。方便追蹤操作責任。本文講的是基於log4j日誌打印的,來生成系統操作日誌。其實就是每次執行一個操作的時候調用了一個公共方法,將“登錄人”、“操作時間”、“操作的模塊及方法”保存到了數據庫,用一張表來存儲起來。實

linux 記錄用戶操作日誌

inux 用戶 fin else size sky dba linux sed history USER_IP=`who -u am i 2>/dev/null| awk ‘{print $NF}‘|sed -e ‘s/[()]//g‘` if [ "$USER

Spring_AOP 記錄系統關鍵操作日誌用法

解決 ati rgs pad tope reads 匿名 ava syslog 問題:   系統需要記錄用戶的關鍵操作日誌,以便後期的系統維護,方便的查看問題,及時排除 分析:   (1)保存字段:作為一個日誌記錄功能,首先數據庫新建一張表保存用戶的操作關鍵字段,   

asp.net mvc 系統操作日誌設計

保存 com 持久化 cli 數據 .net 登錄 clas gpo 第一步、系統登錄日誌 通過signalr來管理用戶的登錄情況,並保存用戶的登錄記錄。 第二步 通過mvc過濾器,來橫切路由訪問記錄。 保存方式:通過httpclient異步請求webapi

Linux bash運維操作日誌審計(單服務器)

histsize tro chat done shel 特殊 lsattr pan att 目前公司有幾臺機器比較重要,需要把所有用戶的操作記錄下來,於是就是參照資料來完成 1. vim /etc/profile.d/oplogrc.sh logdir=/opt/opl

實現Web層的日誌切面(方便清晰查看日誌)

except factor thold back ear 請求參數 framework java.net fit 1 import org.aspectj.lang.JoinPoint; 2 import org.aspectj.lang.Signature;