AOP日志-后置通知

创建切面类处理日志

@Component
@Aspect
public class LogAop {

	@Autowired
	private HttpServletRequest request;
	
	@Autowired
	private ISysLogService sysLogService;
	
	private Date startTime; // 访问时间
	
	private Class executionClass;// 访问的类	
	
	private Method executionMethod; // 访问的方法		
	
	// 主要获取日志中其它信息,时长、ip、url...
	@After("execution(* com.learn.ssm.controller.*.*(..))")
	public void doAfter(JoinPoint jp) throws Exception {
		// 获取类上的@RequestMapping对象
		if (executionClass != SysLogController.class) {
			RequestMapping classAnnotation = (RequestMapping)
			executionClass.getAnnotation(RequestMapping.class);
			if (classAnnotation != null) {
				// 获取方法上的@RequestMapping对象
				RequestMapping methodAnnotation =
				executionMethod.getAnnotation(RequestMapping.class);
				if (methodAnnotation != null) {
					String url = ""; // 它的值应该是类上的@RequestMapping的value+方法上的
					@RequestMapping的value
					url = classAnnotation.value()[0] + methodAnnotation.value()[0];
					SysLog sysLog = new SysLog();
					// 获取访问时长
					Long executionTime = new Date().getTime() - startTime.getTime();
					// 将sysLog对象属性封装
					sysLog.setExecutionTime(executionTime);
					sysLog.setUrl(url);
					// 获取ip
					String ip = request.getRemoteAddr();
					sysLog.setIp(ip);
					// 可以通过securityContext获取,也可以从request.getSession中获取
					SecurityContext context = SecurityContextHolder.getContext(); //
					request.getSession().getAttribute("SPRING_SECURITY_CONTEXT")
					String username = ((User)
					(context.getAuthentication().getPrincipal())).getUsername();
					sysLog.setUsername(username);
					sysLog.setMethod("[类名]" + executionClass.getName() + "[方法名]" +
					executionMethod.getName());
					sysLog.setVisitTime(startTime);
					// 调用Service,调用dao将sysLog insert数据库
					sysLogService.save(sysLog);
				}
			}
		}
	}
}

在切面类中我们需要获取登录用户的username,还需要获取ip地址,我们怎么处理?

username获取

SecurityContextHolder获取

ip地址获取

ip地址的获取我们可以通过request.getRemoteAddr()方法获取到。

在Spring中可以通过RequestContextListener来获取request或session对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值