maven依赖包
<!--AOP切面配置 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.6</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.6</version> </dependency> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency>
springMVC.xml配置
<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> <!-- 自动扫描包 --> <context:component-scan base-package="com.mis.yxnz.controller"></context:component-scan> <!--扫描AOP包 --> <context:component-scan base-package="com.mis.yxnz.common"></context:component-scan> <!-- AOP 代理开启 --> <aop:aspectj-autoproxy expose-proxy="true"></aop:aspectj-autoproxy> <!-- 视图解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- <property name="prefix" value="WEB-INF/views/"></property> --> <property name="prefix" value="page/"></property> <property name="suffix" value=".jsp"></property> </bean> <mvc:default-servlet-handler /> <mvc:annotation-driven></mvc:annotation-driven> <!-- 配置transactionManager事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置事物通知属性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- 定义事物传播特性 --> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="edit*" propagation="REQUIRED" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="new*" propagation="REQUIRED" /> <tx:method name="set*" propagation="REQUIRED" /> <tx:method name="remove*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="change*" propagation="REQUIRED" /> <tx:method name="check*" propagation="REQUIRED" /> <tx:method name="get*" propagation="REQUIRED" /> <tx:method name="find*" propagation="REQUIRED" /> <tx:method name="load*" propagation="REQUIRED" /> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <!-- 配置事物切面 --> <aop:config> <aop:pointcut id="serviceOperation" expression="execution(* com.mis.yxnz.service.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" /> </aop:config> <!--避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 --> </list> </property> </bean> <!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默认编码 --> <property name="defaultEncoding" value="utf-8" /> <!-- 文件大小最大值 --> <property name="maxUploadSize" value="10485760000" /> <!-- 内存中的最大值 --> <property name="maxInMemorySize" value="40960" /> </bean> <!-- 静态资源处理 css js imgs --> <mvc:resources location="/resources/**" mapping="/resources" /> <mvc:annotation-driven> <!-- 消息转换器,解决responseBody返回中外乱码问题 --> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes" value="text/plain;charset=UTF-8" /> </bean> </mvc:message-converters> </mvc:annotation-driven> <mvc:annotation-driven /> <!-- 拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- /**表示所有url包括子url路径 --> <mvc:mapping path="/**" /> <bean class="com.mis.yxnz.util.HandlerInterceptor" /> </mvc:interceptor> </mvc:interceptors> <mvc:resources location="/" mapping="/**/*.css" /> <mvc:resources location="/" mapping="/**/*.js" /> </beans>
公共类
package com.mis.yxnz.common.annotation;
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; /** * @category ——初始化自定义注解 SysLogT 默认参数"" * <p>Description: 系统日志注解</p> * @author LiQian * @date 2018年10月8日 * @version 3.0 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SysLogT { String value() default ""; }
package com.mis.yxnz.common.aspect; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.google.gson.Gson; import com.mis.yxnz.common.annotation.SysLogT; import com.mis.yxnz.entity.XtglOperationLog; import com.mis.yxnz.service.XtglOperationLogService; import com.mis.yxnz.util.HttpContextUtils; import com.mis.yxnz.util.IPUtils; import net.sf.json.JSONObject; /** * <p> * Description: 系统日志,切面处理类 * </p> * * @author LiQian * @date 2018年10月8日 * @version 3.0 */ @Aspect @Component public class SysLogAspect { @Autowired private HttpServletRequest request; @Autowired private XtglOperationLogService xtglOperationLogService; //@Pointcut("") public SysLogAspect() { System.out.println("********"); // super(); } @Around("execution(* com.mis.yxnz.controller.*.*.*(..))&&@annotation(log)") public Object around(ProceedingJoinPoint point, SysLogT log) throws Throwable { System.out.println("*********************around*************************"); long beginTime = System.currentTimeMillis(); Object result = point.proceed(); long time = System.currentTimeMillis() - beginTime; boolean m = true; // 回调方法 保存日志 saveSysLog(point, time,result); return result; } private void saveSysLog(ProceedingJoinPoint joinPoint, long time,Object result) { try { HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); JSONObject object = JSONObject.fromObject(result); String msg=object.getString("msg"); System.out.println("执行情况:" + msg); String menth= joinPoint.getTarget().getClass().getName()+"."+signature.getName()+"()"; System.out.println("请求方法:" + menth); SysLogT syslog = method.getAnnotation(SysLogT.class); XtglOperationLog log = new XtglOperationLog(); HttpSession session = request.getSession(); Object[] args = joinPoint.getArgs(); String params = new Gson().toJson(args[0]); System.out.println("请求参数:"+params); log.setOperationPersonnel(session.getAttribute("userName").toString());// 操作人员 log.setOperationName(syslog.value());// 操作 log.setOperationParameter(params);// 执行参数 log.setOperationCondition(menth);// 执行方法 log.setOperationTime(df.format(new Date()));// 执行时间 log.setOperationIp(IPUtils.getIpAddr(request));// 执行ip log.setOperationExpendTime(Long.toString(time));// 执行耗时 log.setOperationStatus(msg);// 执行情况 log.setOperation_organization_id(Integer.parseInt(session.getAttribute("organization_id").toString()));// 机构外键 xtglOperationLogService.insertSelective(log); } catch (Exception e) { System.out.println("日志记录出错!"); } } }
方法注解,实现记录日志
@SysLogT("删除角色")
@RequestMapping(value = "roleDel", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public R roleDel(@RequestParam("ids") String roleId) {
Integer orgId = Integer.parseInt(CheckSession.GetOrgId(request));
xtglRoleService.deleteByBatch(roleId.split(","));
return R.ok();
}