导入的依赖均为JavaWeb界面在线配置代码生成器这篇文章,你只需将这篇文章的maven依赖导入即可。

SpringAop利用注解的特性进行日志管理,只需在对应的方法上加上自己编写的注解,即可完美实现日志管理。

日志管理的目的是,将后台管理人员,安卓人员,第三方人员每天请求的url和是谁操作的,在哪操作,使用什么系统操作,输入的那些参数,使用什么请求等等统统记录下来。方便异常排查和应对外来的web攻击。

关于Controller和spring-mvc.xml使用了shiro,关于shiro方面可以参考我的如下文章,进行学习:

MP实战系列(九)之集成Shiro

shiro实战系列

步骤如下:

一、编写注解类

package com.anotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog { String type() default "";//日志类型
String action() default "";//作用
String method() default "";//请求方式 }

二、编写Aspect

package com.anotation;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Method;
import java.math.BigDecimal; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.SysCompany;
import com.entity.SysUser;
import com.service.SysCompanyService;
import com.service.SysLogService;
import com.service.SysUserService; import cn.hutool.core.date.DateUtil;
import cn.hutool.system.HostInfo;
import cn.hutool.system.OsInfo;
import cn.hutool.system.SystemUtil; public class SysLogAspect { @Autowired
private SysLogService sysLogService; @Autowired
private SysUserService userService; @Autowired
private SysCompanyService companyService; /**
* 环绕通知
*
* @param joinPoint
* @return
* @throws Throwable
*/
public Object aroud(ProceedingJoinPoint joinPoint) throws Throwable { // 开始时间
long beginTime = System.currentTimeMillis(); // 执行目标方法
Object result = joinPoint.proceed(); // 执行时长(毫秒)
long time = System.currentTimeMillis() - beginTime; // 保存日志
saveSysLog(joinPoint, time); return result;
} /**
* 保存日志
*
* @param joinPoint
* @param time
*/
private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod(); SysLog sysLog = method.getAnnotation(SysLog.class); com.entity.SysLog log = new com.entity.SysLog(); HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); //获取session
String userCode = (String) request.getSession().getAttribute("userCode"); //获取用户信息
EntityWrapper<SysUser> wrapper = new EntityWrapper<SysUser>();
wrapper.eq("user_code", userCode);
SysUser user = userService.selectOne(wrapper); //获取公司信息
EntityWrapper<SysCompany> wrapper2 = new EntityWrapper<SysCompany>();
wrapper2.eq("company_code", user.getCorpCode());
SysCompany company = companyService.selectOne(wrapper2); if (sysLog != null) { HostInfo hostInfo = SystemUtil.getHostInfo();
OsInfo osInfo = SystemUtil.getOsInfo();
log.setLogType(sysLog.type());
log.setLogTitle(sysLog.action());
log.setRequestMethod(sysLog.method());
log.setRequestUri(request.getRequestURI());
log.setRemoteAddr(request.getRemoteAddr());
log.setDeviceName(osInfo.getName());
log.setBrowserName(request.getHeader("User-Agent"));
log.setRequestParams(request.getQueryString());
log.setCreateBy(user.getUserName());
log.setCreateByName(user.getUserName());
log.setCreateDate(DateUtil.date().toString());
log.setServerAddr(hostInfo.getAddress());
log.setExecuteTime(BigDecimal.valueOf(time));
log.setIsException("否");
log.setCorpCode(company.getCorpCode());
log.setCorpName(company.getCompanyName()); }
// 保存系统日志
sysLogService.insert(log); } }

三、在spring-mvc.xml配置aop

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c" xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xmlns:ehcache="http://www.springmodules.org/schema/ehcache"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springmodules.org/schema/ehcache http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd">
<aop:aspectj-autoproxy />
<!-- Controller包(自动注入) -->
<context:component-scan base-package="com.controller"/> <!-- 将 springSwaggerConfig加载到spring容器 -->
<bean class="com.mangofactory.swagger.configuration.SpringSwaggerConfig" /> <mvc:default-servlet-handler/> <bean class="com.listener.InitDataListener"/> <!-- FastJson注入 -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true"> <bean id="fastJsonHttpMessageConverter"
class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list> <value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 上传限制 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上传文件大小限制为31M,31*1024*1024 -->
<property name="maxUploadSize" value="32505856"/>
</bean> <!-- shiro 验证注解start -->
<!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
<property name="proxyTargetClass" value="true" />
</bean> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean> <!-- 异常处理 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="org.apache.shiro.authz.UnauthorizedException">/error/unauthorized</prop>
<prop key="org.apache.shiro.authz.UnauthenticatedException">/error/unlogined</prop>
</props>
</property>
</bean> <!-- 切面 -->
<bean id="sysLogAspect" class="com.anotation.SysLogAspect"></bean> <aop:config>
<aop:aspect ref="sysLogAspect">
<aop:pointcut expression="@annotation(com.anotation.SysLog)" id="sysLogPointcut"/>
<aop:around method="aroud" pointcut-ref="sysLogPointcut"/>
</aop:aspect>
</aop:config>
</beans>

四、在对应的Controller方法上加上注解即可

/**
* 账号登录
* @param request
* @return
*/
@PostMapping(value = "/login",produces="application/json;charset=utf-8")
@SysLog(type="后台系统",action="登录功能",method="POST")
@ApiOperation(value="登录",httpMethod="POST",notes="登录")
public JSONObject login(@RequestParam String username, @RequestParam String password, HttpSession session,HttpServletResponse response) {
//接收前台参数
logger.info("用户名:"+username);
logger.info("密码:"+password);
//调用查询逻辑
EntityWrapper<SysUser> wrapper = new EntityWrapper<SysUser>();
wrapper.eq("login_code", username);
SysUser user = userService.selectOne(wrapper); JSONObject json = new JSONObject(); if(user != null && "0".equals(user.getStatus())) {
//获取当前用户
Subject subject = SecurityUtils.getSubject(); //根据前台传的用户名和密码进行认证
UsernamePasswordToken token = new UsernamePasswordToken(username, password); try {
//认证通过
subject.login(token); String encode = Base64.encode(user.getUserCode()); //Cookie有效期默认为8小时
int time=28800; //将Cookie加密为16进制字符串
CookieUtils.setCookie(response, "userCode", encode, time); user.setLastLoginDate(DateUtil.date());
userService.updateById(user); //将userCode放入session中保存
session.setAttribute("userCode", user.getUserCode()); json.put("token", subject.getSession().getId());
json.put(CommonEnum.RETURN_CODE, "000000");
json.put(CommonEnum.RETURN_MSG, "登录成功");
} catch (IncorrectCredentialsException e) {
json.put(CommonEnum.RETURN_CODE, "111111");
json.put(CommonEnum.RETURN_MSG, "用户名或密码错误");
}catch (Exception e) {
json.put(CommonEnum.RETURN_CODE, "222222");
json.put(CommonEnum.RETURN_MSG, "特殊异常");
}
}else {
json.put(CommonEnum.RETURN_CODE, "500");
json.put(CommonEnum.RETURN_MSG, "用户不存在");
} return json; }

SpringAop之日志管理的更多相关文章

  1. SpringAop进行日志管理。

    在java开发中日志的管理有非常多种.我通常会使用过滤器,或者是Spring的拦截器进行日志的处理.假设是用过滤器比較简单,仅仅要对全部的.do提交进行拦截,然后获取action的提交路径就能够获取对 ...

  2. SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)

    转载:http://itindex.net/detail/50710-springaop-controller-service 从业近二,三年了,第一次写博客,平时做做脚手架或者架构一些基础框架然后给 ...

  3. 微服务(SOP)日志管理

    问题: 大型企业应用规模大,调试 / 解决问题由于在生产环境中不会有开发环境的调试工具,如果需要模拟还原当时的环境, 目前的解决办法是进行日志记录 日志记录的常用方式: 使用SpringAop进行切入 ...

  4. 第13章 Linux日志管理

    1. 日志管理 (1)简介 在CentOS 6.x中日志服务己经由rsyslogd取代了原先的syslogd服务.rsyslogd日志服务更加先进,功能更多.但是不论该服务的使用,还是日志文件的格式其 ...

  5. ABP(现代ASP.NET样板开发框架)系列之8、ABP日志管理

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之8.ABP日志管理 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  6. 【Java EE 学习 76 下】【数据采集系统第八天】【通过AOP实现日志管理】【日志管理功能分析和初步实现】

    一.日志管理相关分析 1.日志管理是一种典型的系统级别的应用,非常适合使用spring AOP实现. 2.使用日志管理的目的:对系统修改的动作进行记录,比如对权限.角色.用户的写操作.修改操作.删除操 ...

  7. ElasticSearch+NLog+Elmah实现Asp.Net分布式日志管理

    本文将介绍使用NLOG.Elmah结合ElasticSearch实现分布式日志管理. 一.ElasticSearch简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布 ...

  8. Apache 日志管理,获取客户端端口号

    日志管理分类 日志文件是用户管理和监控 Apache 安全的非常好的第一手资料,它清晰地记录了客户端访问 Apache 服务器资源的每一条记录,以及在访问中出现的错误信息,可以这样说,Apache 可 ...

  9. linux 学习 14 日志管理

    第十四讲 日志管理 14.1 日志管理-简介 .日志服务 在CentOS .x中日志服务已经由rsyslogd取代了原先的syslogd服务.rsyslogd日志服务更加先进,功能更多.但是不论该服 ...

随机推荐

  1. tomcat绑定域名绑定端口及更换ROOT目录

    一.更换ROOT目录 tomcat默认网站目录为 webapps/ROOT ,那么我们如何改为自己的网站目录呢? 1.打开并编辑tomcat目录下的 conf/server.xml 大约在148行的位 ...

  2. powerdesigner 将表中name列值复制到comment列 (保留原有comment)

    /** * PowerDesigner里面将表中name列值复制到comment列 * @see --------------------------------------------------- ...

  3. H5前端的关于像素解释

    场景: 人物:前端实习生「阿树」与 切图工程师「玉凤」 事件:设计师出设计稿,前端实现页面 玉凤:树,设计稿发给你啦,差那么点像素,就叼死你┏(  ̄へ ̄)=☞ 阿树:~(>_<)~毛问题噶 ...

  4. Hibernate 注解 (Annotations 三)多对一双向注解

    注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来 ...

  5. JavaScript This -笔记

    参考文章:blog.crimx.com/2016/05/12/understanding-this/ 在es6箭头函数之前this是执行时候确定的,而非定义时候确定.函数都是被调用的,调用时找前面调用 ...

  6. 06_zookeeper原生Java API使用

    [Zookeeper构造方法概述] /** * 客户端和zk服务端的连接是一个异步的过程 * 当连接成功后,客户端会收到一个watch通知 * * ZooKeeper(String connectSt ...

  7. vs2010开发activex(MFC)控件/ie插件(三),js调用ocx控件的接口函数

    原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50802280   js调用ocx控件的接口函数,先看demo效果:      简单测试过程 ...

  8. Opencv2.4.13与Visual Studio2013环境搭建配置教程

    转载:http://www.jb51.net/article/108943.htm 一.安装包的下载与安装 Opencv可免费到官网上去下载,opencv是国外软件,在下载是由于受资源的限制,可能会出 ...

  9. c# FTP操作类(转)

    using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net ...

  10. Tomcat的运行模式

    tomcat的三种运行模式 tomcat Tomcat Connector的三种不同的运行模式性能相差很大,有人测试过的结果如下:  这三种模式的不同之处如下: ●BIO:  一个线程处理一个请求.缺 ...