感覺以後會用到記錄一下
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(){}
}