IP地址获取

package cn.roderick.aspects;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Enumeration;


@Component
@Aspect

/*
 * 定义切面执行的优先级,数字越低,优先级越高
 * 在切入点之前执行:按order值有小到大的顺序执行
 * 在切入点之后执行:按order值由大到小的顺序执行
 */
@Order(-5)
public class AppLogAspect {

    private Logger logger = LogManager.getLogger(AppLogAspect.class);

    // 保证每个线程都有一个单独的实例
    private ThreadLocal time = new ThreadLocal<>();

    @Pointcut("execution(* com.sbm.controller..*.*(..))")
    public void pointcut() {
    }

    @Before("pointcut()")
    public void doBefore(JoinPoint joinPoint) {
        time.set(System.currentTimeMillis());

        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        //记录请求的内容
        logger.info("Request URL: " + request.getRequestURL().toString());
        logger.info("Request Method: " + request.getMethod());

        String ip = request.getRemoteAddr();
        if (ip.indexOf(":0") > -1) {
            ip = IPUtil.getRealIp();
        }
        logger.info("IP: " + ip);
        logger.info("User-Agent: " + request.getHeader("User-Agent"));
        logger.info("Class Method: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        logger.info("Cookies: " + request.getCookies());

        logger.info("Params: " + Arrays.toString(joinPoint.getArgs()));

        Enumeration enums = request.getParameterNames();
        while (enums.hasMoreElements()) {
            String paraName = enums.nextElement();
            logger.info(paraName + ":" + request.getParameter(paraName));
        }
    }

    @AfterReturning("pointcut()")
    public void doAfterReturning(JoinPoint joinPoint) {
        logger.info("耗时 : " + ((System.currentTimeMillis() - time.get())) + "ms");
        logger.info("AppLogAspect.doAfterReturning()");
    }


}
 
  
package cn.roderick.util;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;


public class IPUtil {
    public static String getRealIp() {
        String realIp = null;
        InetAddress ip = null;

        try {
            if (isWindowsOS()) { // windows
                ip = InetAddress.getLocalHost();
            } else { // Linux ,从网卡中获取ip地址
                boolean bFindIP = false;
                Enumeration netInterfaces =
                        (Enumeration) NetworkInterface.getNetworkInterfaces();
                NetworkInterface ni = null;
                Enumeration ips = null;
                while (netInterfaces.hasMoreElements()) {
                    if (bFindIP) {
                        break;
                    }
                    ni = (NetworkInterface) netInterfaces.nextElement();
                    ips = ni.getInetAddresses();
                    while (ips.hasMoreElements()) {
                        ip = (InetAddress) ips.nextElement();
                        if (ip.isSiteLocalAddress()
                                && !ip.isLoopbackAddress()   //127.开头的都是lookback地址a
                                && ip.getHostAddress().indexOf(":") == -1) {
                            bFindIP = true;
                            break;
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        if (ip != null) {
            realIp = ip.getHostAddress();
        }
        return realIp;
    }

    /**
     * 判断当前系统类型
     *
     * @return
     */
    private static boolean isWindowsOS() {
        boolean isWindowsOS = false;
        String osName = System.getProperty("os.name");
        if (osName.toLowerCase().indexOf("windows") > -1) {
            isWindowsOS = true;
        }

        return isWindowsOS;
    }
}
 
 

你可能感兴趣的:(Linux,&,Android,&JAVA)