最近项目结束,闲来无事,开始研究如何将我们比较简单的项目丰满起来,就做了个基于切面的切点的日志记录模块,统一处理异常,统一返回结果。 刚开始只能记录get请求的参数,后来经过查阅博客,完善成为get,post都能记录参数的功能。
import com.*.entity.Logininfo;
import com.*.entity.ResultBean;
import com.*.mapper.LogininfoMapper;
import com.*.util.UserAgentUtils;
import eu.bitwalker.useragentutils.Browser;
import eu.bitwalker.useragentutils.DeviceType;
import eu.bitwalker.useragentutils.UserAgent;
import eu.bitwalker.useragentutils.Version;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
/**
* 环绕通知,环绕增强,相当于MethodInterceptor
*/
@Around("webLog()")
@SuppressWarnings("unchecked")
public ResultBean<Object> arround(ProceedingJoinPoint pjp) {
ResultBean<Object> resultBean;
Logininfo loginInfo=new Logininfo();
try {
long startTime = System.currentTimeMillis();
resultBean = (ResultBean<Object>) pjp.proceed();
// loginInfo.setResult(result.toString());
long endTime = System.currentTimeMillis();
loginInfo.setExecuteTime(endTime - startTime);
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
assert attributes != null;
HttpServletRequest req = attributes.getRequest();
String loginName = req.getParameter("userName");
String loginName1 = (String) req.getSession().getAttribute("loginName");
if (StringUtil.isNotEmpty(loginName)) {
loginInfo.setOperator(loginName);
} else if (StringUtil.isNotEmpty(loginName1)) {
loginInfo.setOperator(loginName1);
} else {
System.out.println("没有用户哦!");
//如果没有用户信息,则让用户登录
// req.getRequestDispatcher("/index.html").forward(req,response);
}
// 记录下请求内容
loginInfo.setRequestIp(req.getRemoteAddr());
loginInfo.setMethod(req.getMethod());
String browser = req.getHeader("User-Agent");
loginInfo.setUri(req.getRequestURI());
Enumeration<String> parameterNames = req.getParameterNames();
//参数
StringBuilder param = new StringBuilder();
while (parameterNames.hasMoreElements()) {
String str = parameterNames.nextElement();
param.append(str).append(":").append(req.getParameter(str)).append("&");
}
loginInfo.setParams(param.toString());
loginInfo.setPort(req.getRemotePort());
UserAgent userAgent = UserAgentUtils.getUserAgent(req);
DeviceType deviceType = UserAgentUtils.getDeviceType(req);
loginInfo.setDeviceType(deviceType.toString());
String name = userAgent.getBrowser().getName();//发出请求的浏览器标识
String osName;
if (name.contains("Mobile")) {
osName = userAgent.getOperatingSystem().getName();
if (osName.contains("Mac")) {
System.out.println("我是苹果公司的");
} else {
StringTokenizer st = new StringTokenizer(browser, ";");
String mode = UserAgentUtils.getMode(browser);
loginInfo.setMode(mode);
st.nextToken();
if (st.hasMoreElements()) {
st.nextToken();
if (st.hasMoreElements()) {
osName = st.nextToken();
}
}
}
} else {
osName = userAgent.getOperatingSystem().getName();
}
loginInfo.setOsName(osName);
Browser browser1 = userAgent.getBrowser();
Version version = browser1.getVersion(browser);
String browserinfo;
if (version == null) {
browserinfo = browser1.getName();
} else {
browserinfo = browser1.getName() + " " + version.getVersion();
}
loginInfo.setBrowserinfo(browserinfo);
loginInfo.setResult(resultBean.getData().toString());
} catch (Throwable e) {
loginInfo.setException(e.toString());
e.printStackTrace();
resultBean = new ResultBean<>();
resultBean.setCode(-1);
resultBean.setMsg("数据库异常了!!");
}
loginInfo.setCreateTime(new Date());
System.out.println(loginInfo);
logininfoMapper.insert(loginInfo);
return resultBean;
}