Spring 的 AOP切面用法


 * 拦截器:记录用户操作日志,检查用户是否登录……

@Aspect
@Component

public class ControllerInterceptor {
    private static final Logger logger = LoggerFactory.getLogger(ControllerInterceptor.class);

    @Value("${spring.profiles}")
    private String env;

    @Autowired
    private SystemLogsService systemLogsService;

    /**
     * 定义拦截规则:拦截com.space.web.controller包下面的所有类中,有@RequestMapping注解的方法。
     */

    @Pointcut("execution(* com.space.web.controller..*(..)) and @annotation(org.springframework.web.bind.annotation.RequestMapping)")
    public void controllerMethodPointcut() {

    }

    /**
     * 拦截器具体实现
     * 
     * @param pjp
     * @return JsonResult(被拦截方法的执行结果,或需要登录的错误提示。)
     */

    @Around("controllerMethodPointcut()")
    // 指定拦截器规则;也可以直接把“execution(* com.space.........)”写进这里
    public Object Interceptor(ProceedingJoinPoint pjp) {
        long beginTime = System.currentTimeMillis();
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        Method method = signature.getMethod(); // 获取被拦截的方法
        String methodName = method.getName(); // 获取被拦截的方法名

        Set<Object> allParams = new LinkedHashSet<>(); // 保存所有请求参数,用于输出到日志中

        String userid = "";
        String referer = "";
        String starttime = XDateUtils.nowToString();
        logger.info("请求开始,方法:{}", methodName);

        Object result = null;

        Object[] args = pjp.getArgs();
        for (Object arg : args) {
            // logger.debug("arg: {}", arg);
            if (arg instanceof Map<?, ?>) {
                // 提取方法中的MAP参数,用于记录进日志中
                @SuppressWarnings("unchecked")
                Map<String, Object> map = (Map<String, Object>) arg;

                allParams.add(map);
            } else if (arg instanceof HttpServletRequest) {
                HttpServletRequest request = (HttpServletRequest) arg;
                try {
                    HttpSession session = request.getSession();
                    if (!(session == null ? "" : session).equals("")) {
                        Object userCode = session.getAttribute("usercode");
                        if (!(userCode == null ? "" : userCode).equals("")) {
                            userid = userCode.toString();
                        }
                    }

                    referer = request.getHeader("Referer"); // 来源
                    if ((referer == null || referer.isEmpty() ? "" : referer).equals("")) {
                        referer = HttpVisitors.ip(request);
                    }

                    URL rUrl = new URL(request.getRequestURL().toString());
                    String domain = rUrl.getHost().toLowerCase();
                    String port = ":" + String.valueOf(rUrl.getPort());
                    if (rUrl.getPort() == 80) {
                        port = "";
                    }
                    String basicUrl = request.getScheme() + "://" + domain + port + request.getContextPath();

                    GlobalConfig.setScheme(request.getScheme());
                    GlobalConfig.setDomain(domain);
                    GlobalConfig.setPort(rUrl.getPort());
                    GlobalConfig.setContextPath(request.getContextPath());
                    GlobalConfig.setBasicUrl(basicUrl);

                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                }
                if (isLoginRequired(method)) {
                    if (!isLogin(request)) {
                        result = new JsonResult(ResultCode.NOT_LOGIN, "该操作需要登录!");
                    }
                }

                // 获取query string 或 posted form data参数
                Map<String, String[]> paramMap = request.getParameterMap();
                if (paramMap != null && paramMap.size() > 0) {
                    allParams.add(paramMap);
                }
            } else if (arg instanceof HttpServletResponse) {
                // do nothing...
            } else {
                // allParams.add(arg);
            }
        }

        String abnormalinfor = "";
        try {
            if (result == null) {
                // 一切正常的情况下,继续执行被拦截的方法
                result = pjp.proceed();
            }
        } catch (Throwable e) {
            logger.info("exception: ", e);
            abnormalinfor = e.getMessage();
            result = new JsonResult(ResultCode.EXCEPTION, "发生异常:" + e.getMessage());
        }

        if (result instanceof JsonResult) {
            long costMs = System.currentTimeMillis() - beginTime;
            logger.info("{}请求结束,耗时:{}ms", methodName, costMs);

            try {
                SystemLogs log = new SystemLogs();
                log.setUserid(userid);
                log.setMethod(methodName);
                log.setStarttime(starttime);
                log.setEndtime(XDateUtils.nowToString());
                log.setConsumtime(costMs);
                log.setAbnormalinfor(abnormalinfor);
                log.setReferer(referer);
                systemLogsService.insertSystemLog(log);
            } catch (Exception e) {
            }
        }

        return result;
    }

    /**
     * 判断一个方法是否需要登录
     * 
     * @param method
     * @return
     */
    private boolean isLoginRequired(Method method) {
        // 只有生产环境才需要登录
        if (!env.equals("prd")) {
            return false;
        }
        boolean result = true;
        if (method.isAnnotationPresent(Permission.class)) {
            result = method.getAnnotation(Permission.class).loginReqired();
        }
        return result;
    }

    /***
     * 判断是否已经登录
     * 
     * @param request
     * @return
     */
    private boolean isLogin(HttpServletRequest request) {
        HttpSession session = request.getSession();
        if (!(session == null ? "" : session).equals("")) {
            Object userID = session.getAttribute("usercode");
            if (!(userID == null ? "" : userID).equals("")) {
                return true;
            }
        }
        return false;
    }
}
 

猜你喜欢

转载自blog.csdn.net/word_joke/article/details/83211851