基於ssm整合spring-security 記錄日誌 訪問歷史 功能

感覺以後會用到記錄一下
1.配置springmvc.xml文件

		<!-- aop的自動代理 -->
		<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
		<!--配置開啓security的註解支持-->
		<security:global-method-security secured-annotations="enabled"/>

2.日誌表

create table sys_log(
id int primary key auto_increment, -- 主鍵
visitTime date,-- 訪問時間
username varchar(50),-- 訪問用戶名
ip varchar(30),-- 訪問的ip地址
method varchar(200)-- 訪問的方法 類名+方法名
)

3.編寫日誌切面類


/**
 * 日誌切面類 (切入點和通知(又叫增強)的組合 )
 *
 *  註解完成 切面類編寫
 *      注意:1.當前類需交給spring容器 管理 (當前類創建對象由spring容器管理)
 *            2.因爲是切面類,加入@Aspect
 */

@Component
@Aspect
public class LogAspect {

    @Autowired
    private HttpServletRequest request; //spring容器默認已經管理了HttpServletRequest

    @Autowired
    private LogService logService; //logservice中有一保存方法其mapper配置如下
	 
   // <insert id="save" parameterType="sysLog">
   //     insert into sys_log(visitTime,username,ip,method) values(now(),#{username},#{ip},#{method})
    //</insert>
    /**
     * 環繞通知一般會有返回值 ,Object
     * @param joinPoint  參數用於 對目標執行環繞後,需提供一個返回值
     * @return
     */
    @Around(value="pointcut1()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {

        //1. 創建日誌對象
        SysLog log = new SysLog();
        //2. 將需要的數據封裝到 日誌對象
        log.setIp(request.getRemoteAddr()); //將客戶機ip存入log

        //可以從security上下文對象中得到用戶名
        SecurityContext context = SecurityContextHolder.getContext();
        Authentication authentication = context.getAuthentication();
        User user = (User) authentication.getPrincipal();   //拿到 用戶對象重要信息
        log.setUsername(user.getUsername());    //得到用戶名

        Object target = joinPoint.getTarget();  //拿到被增強目標類(就是所有xxxController類)對象
        String className = target.getClass().getName(); //拿到被增強類名字

        String methodName = joinPoint.getSignature().getName();//拿到 實際被增強方法的簽名
        log.setMethod(className+"."+methodName);

        //3. 將日誌存入到 數據庫
        logService.save(log);

        //對目標 環繞增強後,得到的返回值
        Object proceed = joinPoint.proceed();
        //環繞後,只需要將當前proceed對象返回
        return proceed;
    }

    @Pointcut(value="execution(* cn.hp.controller.*.*(..))")
    private void pointcut1(){}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章