spring 提供了完善的事件监听
1.创建事件操作对象
package com.cozi.xiaosai.domain;
/**
* @Author xiaosai
* @Date 2019-12-12 11:46
* @Version 1.0
*/
public class LogInfo {
private Integer id;
// 操作者
private String operator;
// 操作模块
private Integer operationModule;
// 操作类型
private String operationType;
// 操作对象
private String operands;
// 操作时间
private String operationTime;
// 操作ip
private String ip;
// 操作内容
private String operationContent;
private String createTime;
private String modifyTime;
// get()和set();
}
2.自定义事件
自定义事件继承ApplicationEvent,ApplicationEvent由spring boot提供支持
package com.cozi.xiaosai.event;
import com.cozi.xiaosai.domain.LogInfo;
import org.springframework.context.ApplicationEvent;
/**
* 日志监听自定义事件
* @author xiaosai
* @version 1.0
* @date 2019-12-24 15:43
* @describe
*/
public class LogBehaviorEvent extends ApplicationEvent {
private LogInfo logInfo;
public LogBehaviorEvent(Object source, LogInfo logInfo) {
super(source);
this.logInfo=logInfo;
}
public LogInfo getLogInfo() {
return logInfo;
}
public void setLogInfo(LogInfo logInfo) {
this.logInfo = logInfo;
}
}
3.自定义事件监听
具体的代码逻辑实现
package com.cozi.xiaosai.listener;
import com.cozi.xiaosai.domain.LogInfo;
import com.cozi.xiaosai.event.LogBehaviorEvent;
import com.cozi.xiaosai.service.tool.Log1oneService;
import com.cozi.xiaosai.util.IpUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import javax.servlet.http.HttpServletRequest;
/**
* 日志自定义事件监听
* @author xiaosai
* @version 1.0
* @date 2019-12-24 15:43
* @describe
*/
@Component
public class LogBehaviorListener {
@Autowired
private Log1oneService log1oneService;
@EventListener
public void onLogBehaviorEvent(LogBehaviorEvent logBehaviorEvent){
if(logBehaviorEvent!=null){
LogInfo logInfo = logBehaviorEvent.getLogInfo();
//获取RequestAttributes
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
//从获取RequestAttributes中获取HttpServletRequest的信息
HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
String ipAddr = IpUtil.getIpAddr(request);
logInfo.setIp(ipAddr);
logInfo.setOperator("admin");
log1oneService.addLog(logInfo);
}
}
}
4.自定义事件发布
package com.cozi.xiaosai.publistener;
import com.cozi.xiaosai.domain.LogInfo;
import com.cozi.xiaosai.event.LogBehaviorEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
/**
* 日志监听发布事件
* @author xiaosai
* @version 1.0
* @date 2019-12-24 15:43
* @describe
*/
@Component
public class LogBehaviorPublistener {
private final ApplicationContext applicationContext;
@Autowired
public LogBehaviorPublistener(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public void publish(LogInfo logInfo){
applicationContext.publishEvent(new LogBehaviorEvent(this,logInfo));
}
}
5.自定义事件调用
package com.cozi.xiaosai.controller.web.userControl;
import com.cozi.xiaosai.annotation.Log1oneAnnotation;
import com.cozi.xiaosai.common.PageFormatConver;
import com.cozi.xiaosai.common.R;
import com.cozi.xiaosai.common.SetAnnotationValue;
import com.cozi.xiaosai.domain.LogInfo;
import com.cozi.xiaosai.enums.OperationModule;
import com.cozi.xiaosai.enums.OperationObjects;
import com.cozi.xiaosai.enums.OperationType;
import com.cozi.xiaosai.pojo.dataorigin.sys.User;
import com.cozi.xiaosai.pojo.dataorigin.sysParams.UserParams;
import com.cozi.xiaosai.pojo.dataorigin.web.PermissionGroupPojo;
import com.cozi.xiaosai.pojo.dataorigin.webParams.PermissionGroupPojoParams;
import com.cozi.xiaosai.publistener.LogBehaviorPublistener;
import com.cozi.xiaosai.service.sys.UserService;
import com.cozi.xiaosai.service.web.PermissionGroupService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.gson.Gson;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Spliterator;
/**
* @Author xiaosai
* @Date 2019-12-23 15:44
* @Version 1.0
* @Description:
*/
@Controller
@RequestMapping("/xiaosai")
public class UserController {
private final Logger logger = LoggerFactory.getLogger(UserController.class);
@Autowired
private UserService userService;
@Autowired
private PermissionGroupService permissionGroupService;
@Autowired
private LogBehaviorPublistener logBehaviorPublistener;
/**
* 用户列表
* @param userParams
* @return
*/
//@Log1oneAnnotation(operationType = OperationType.SELECT,operands = OperationObjects.XIAOSAI_USER)
@RequestMapping(value = "/userListData",method = RequestMethod.POST)
@ResponseBody
public R getListData(@RequestBody UserParams userParams){
logger.info("用户信息请求参数:"+userParams);
logBehaviorPublistener.publish(new LogInfo(0,OperationModule.TONGYONGPINGTAI.getModule(),OperationType.SELECT.getValue(),OperationObjects.XIAOSAI_USER.getValue(),userParams.toString()));
PageHelper.startPage(userParams.getPage(),userParams.getLimit(),"id");
PageInfo<User> userPageInfo = new PageInfo<>(userService.userListByUser(userParams));
return new PageFormatConver(userPageInfo).isOK();
}
}