切面日志:记录请求ip,方式,参数,异常,结果等,统一处理异常及返回结果

最近项目结束,闲来无事,开始研究如何将我们比较简单的项目丰满起来,就做了个基于切面的切点的日志记录模块,统一处理异常,统一返回结果。 刚开始只能记录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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值