这里是通过注解的方式实现的,也可以通过拦截器实现
import java.lang.annotation.*;
/**
* 自定义注解类
*/
@Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行
@Documented //生成文档
public @interface BrowseLog {
String operEvent() default "";//操作简述
String operType() default "操作日志";//日志类型
}
配置好切面之后下面的业务逻辑就根据自己的业务需要写就可以了
import com.alibaba.fastjson.JSONObject;
import com.mc.jewelrybespoke.app.auth.ApiToken;
import com.mc.jewelrybespoke.app.utils.LocalDateTimeUtil;
import com.mc.jewelrybespoke.entity.LoginUser;
import com.mc.jewelrybespoke.entity.OperatingLedgerTrn;
import com.mc.jewelrybespoke.service.ILoginUserService;
import com.mc.jewelrybespoke.service.INumberSettingService;
import com.mc.jewelrybespoke.service.IOperatingLedgerTrnService;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
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 org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
* 系统日志:切面处理类
*/
@Aspect
@Component
public class SysBrowseLogAspects {
private static final Logger logger = LoggerFactory.getLogger(SysBrowseLogAspects.class);
@Autowired
private IOperatingLedgerTrnService OperatingLedgerTrnService;
@Autowired
private ILoginUserService loginUserService;
@Autowired
INumberSettingService numberSettingService;
//定义切点 @Pointcut
//在注解的位置切入代码
@Pointcut("@annotation(com.mc.jewelrybespoke.app.aoplog.BrowseLog)")
public void logPoinCut() {
}
/*切面 配置通知,各注解作用
*@Before:前置通知,在方法执行之前执行
*@After:后置通知,在方法执行之后执行
*@AfterRunning:返回通知,在方法返回结果之后执行,用这个注解参数会随方法改变,例新增一个实体,参数是一个id为null的,用这个注解后就会赋上真实的id
*@AfterThrowing:异常通知,在方法抛出异常之后执行
*@Around:环绕通知,围绕着方法执行 ProceedingJoinPoint proceed() :获取返回数据 ,需要返回数据
* */
@Around("logPoinCut()")
public Object saveSysLog(ProceedingJoinPoint joinPoint) throws Throwable {
logger.info("-------------------接口日志记录----------------------");
OperatingLedgerTrn operating = new OperatingLedgerTrn();
//从切面织入点处通过反射机制获取织入点处的方法
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
System.out.println("--------signature="+signature);
//获取切入点所在的方法
Method method = signature.getMethod();
System.out.println("--------method="+method);
//获取操作--方法上的BrowseLog的值
BrowseLog browseLog = method.getAnnotation(BrowseLog.class);
if (browseLog != null){
//保存操作事件
String operEvent = browseLog.operEvent();
operating.setOperateType(operEvent);
//保存日志类型
String operType = browseLog.operType();
operating.setType(operType);
}
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//请求来源页地址
// String referer = request.getHeader("referer");
// operating.setPageUrl(referer);
// System.out.println("--------referer-----------"+referer);
// 请求方式:POST/GET
String httpMethod = request.getMethod();
System.out.println("---------httpMethod--------"+httpMethod);
//操作的url
String requestURI = request.getRequestURI();
System.out.println("---------requestURI--------"+requestURI);
String requestURL = request.getRequestURL().toString();
System.out.println("---------requestURL--------"+requestURL);
// 客户端ip
String ip = request.getRemoteAddr();
System.out.println("---------ip--------"+ip);
String number = numberSettingService.getNumber("log_operating_ledger_trn", "olt_id");
operating.setId(number);
//操作人账号\姓名
String username = ApiToken.getUsername();
if (username == null || StringUtils.isBlank(username)) {
username = request.getParameter("mobile");
}
System.out.println("--------------username----------------"+username);
operating.setMemberUser(username);
operating.setRefNo("username");
if (username != null && StringUtils.isNotBlank(username)){
LoginUser loginUser = loginUserService.get(username);
Long memberInfo = loginUser.getMemberInfo().getId();
operating.setMember(memberInfo);
operating.setMemberUser(loginUser.getId());
}
//请求参数信息
String paramter = "";
Object[] args = joinPoint.getArgs();
Object[] arguments = new Object[args.length];
for (int i = 0; i < args.length; i++) {
if (args[i] instanceof ServletRequest || args[i] instanceof ServletResponse || args[i] instanceof MultipartFile) {
continue;
}
arguments[i] = args[i];
}
//响应数据
Object proceed = joinPoint.proceed();
Map proceedMap = JSONObject.parseObject(JSONObject.toJSONString(proceed), Map.class);
System.out.println("==================="+proceed.toString()+"======================");
if (arguments != null){
Map map = new HashMap();
map.put("ip",ip);
map.put("httpMethod",httpMethod);
map.put("url",requestURL);
map.put("description",arguments);
map.put("proceed",proceedMap);
try {
paramter = JSONObject.toJSONString(map);
} catch (Exception e) {
paramter = map.toString().trim();
}
}
System.out.println("--------paramter----------"+paramter);
operating.setDescription(paramter);
operating.setDate(LocalDateTimeUtil.getCurrentTime());
OperatingLedgerTrnService.save(operating);
return proceed;
}
}
之后再需要做日志处理的方法上加上定义的注解就可以了
/**
* 用户账号密码登陆
* @param
* @param
* @return
*/
@BrowseLog(operEvent = "用户账号密码登陆")
@RequestMapping(value = "/appSignInPwd", method = RequestMethod.POST)
@ResponseBody
@ApiOperation(value = "用户账号密码登陆", httpMethod = "POST")
@ApiImplicitParams({
@ApiImplicitParam(name="mobile",value = "手机号",required=true),
@ApiImplicitParam(name="password",value = "密码",required=true)
})
public Result<AppLoginUserVo> appSignInPwd(@RequestParam("mobile") String mobile,@RequestParam("password") String password, HttpServletResponse response) {
//用户名不能为空
if(StringUtils.isBlank(mobile)){
return new ResultUtils<AppLoginUserVo>().setErrorMsg("手机号不能为空");
}
//密码不能为空
if(StringUtils.isBlank(password)){
return new ResultUtils<AppLoginUserVo>().setErrorMsg("密码不能为空");
}
//用户名格式验证
boolean mobile01 = mobile.matches(pw);
if (mobile01 == false) {
return new ResultUtils<AppLoginUserVo>().setErrorMsg(mobile + "手机号格式不正确!");
}
LoginUser user = loginUserService.get(mobile);
if (user == null || StringUtils.isBlank(user.getId())){
return new ResultUtils<AppLoginUserVo>().setErrorMsg("用户不存在,请先注册!!");
}
//MD5
String md5= DigestUtils.md5DigestAsHex(password.getBytes());
String md5Check =DigestUtils.md5DigestAsHex((user.getUuidSalt()+md5).getBytes());
String passwordReal = user.getPassword();
if (!passwordReal.equals(md5Check)){
return new ResultUtils<AppLoginUserVo>().setErrorMsg("密码错误!!请重新输入");
}
String token = ApiToken.genToken(user.getMobile());
response.setHeader("accessToken",token);
user.setLastLoginTime(LocalDateTimeUtil.getCurrentTime());
user = loginUserService.update(user);
AppLoginUserVo appLoginUserVo = ForEachUtil.appSigninForEach(user);
return new ResultUtils<AppLoginUserVo>().setData(appLoginUserVo,"恭喜 "+mobile+" 用户登陆成功!!");
}