自动增加浏览次数
在运行getDetailById方法之前先执行日志注解里面的方法
Map<String,Object> param = new HashMap<String,Object>(1);
param.put("logType", "0");//访问
param.put("businessId", dataId);//业务ID
param.put("userId", user.getUserId());
model.addAttribute("CHECK", gateWayService.getDetailById(param));//当前数据
@LogAnnotation(operationName="添加浏览记录",operationType="addView")
public Check getDetailById(Map<String,Object> param) {
String dataId = (String) param.get("businessId");
Check check = checkMapper.getAdviceById(dataId);
return check;
}
日志自定义注解自动增加浏览记录
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;
/*
* 日志自定义注解
* 常用注解说明:
* 1. RetentionPolicy(保留策略)是一个enum类型,有三个值
* SOURCE -- 这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译后,Annotation的数据就会消失,并不会保留在编译好的.class文件里
* CLASS -- 这个Annotation类型的信息保留在程序源码中,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这一些信息加载到虚拟 机(JVM)中去.注意一下,当你没有设定一个Annotation类型的Retention值时,系统默认值是CLASS。
* RUNTIME -- 在源码、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去的。
*
* 2.ElementType @Target中的ElementType用来指定Annotation类型可以用在哪些元素上
* TYPE(类型) -- 在Class,Interface,Enum和Annotation类型上
* FIELD -- 属性上
* METHOD -- 方法上
* PARAMETER -- 参数上
* CONSTRUCTOR -- 构造函数上
* LOCAL_VARIABLE -- 局部变量
* ANNOTATION_TYPE -- Annotation类型上
* PACKAGE -- 包上
*
* 3.Documented -- 让这个Annotation类型的信息能够显示在API说明文档上;没有添加的话,使用javadoc生成的API文件找不到这个类型生成的信息
*/
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {
/** 要执行的操作类型比如:add操作 **/
public String operationType() default "";
/** 要执行的具体操作比如:添加浏览记录 **/
public String operationName() default "";
}
Spring AOP定义切点
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.alibaba.fastjson.JSON;
/**
* 日志切面
*
*/
@Aspect
@Component
public class AccessLogAspect {
@Autowired
private AccessLogService accessLogService;
private static final Logger logger = LoggerFactory.getLogger(AccessLogAspect.class);
/**
* 第一个*代表所有的返回值类型 第二个*代表所有的类 第三个*代表类所有方法 最后一个..代表所有的参数。
*
* @author
*/
@Pointcut("@annotation(com.common.annotation.LogAnnotation)")
public void serviceAspect() {
}
/**
* 前置通知
*
* @param joinPoint
* @author
*/
@Before("serviceAspect()")
public void doBefore(JoinPoint joinPoint) {
if (logger.isInfoEnabled()) {
logger.info("before " + joinPoint);
}
try {
AccessLogVO log = getServiceMthodParams(joinPoint);
if("1".equals(log.getIsAdmire()))
{
//删除这条记录
accessLogService.deleteAccessLog(log);
}
else
{
accessLogService.addAccessLog(log);
}
} catch (Exception e) {
logger.error("==前置通知异常==");
logger.error("异常信息:{}", e.getMessage());
}
}
/**
* 获得切点参数
* @param joinPoint
* @return
* @throws Exception
* @author
*/
private AccessLogVO getServiceMthodParams(JoinPoint joinPoint) throws Exception {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
// 请求的IP
Object[] arguments = joinPoint.getArgs();
String ip = request.getRemoteAddr();
String params = JSON.toJSONString(arguments[0]);
AccessLogVO log = JSON.parseObject(params, AccessLogVO.class);
log.setAccessLogsId(CommonUtils.getUUID());
log.setAccessIp(ip);
log.setReadTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
return log;
}
}
<insert id="insertAccessLogMapper" parameterType="com.common.model.AccessLogVO">
insert into pb_access_logs
( access_logs_id,
user_id,
read_time,
access_ip,
log_type,
business_id)
values
( #{accessLogsId,jdbcType=VARCHAR},
#{userId,jdbcType=VARCHAR},
#{readTime,jdbcType=VARCHAR},
#{accessIp,jdbcType=VARCHAR},
#{logType,jdbcType=VARCHAR},
#{businessId,jdbcType=VARCHAR}
)
</insert>