分享

RemoteAddressRequestWrapper.java 获取真实IP

 CevenCheng 2011-09-28
/*
 * @(#)RemoteAddressRequestWrapper.java Jun 6, 2007
 *
 * Copyright 2005 Yupoo. All rights reserved.
 */
package com.www.webapp.wrapper;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * <p>
 * <a href="RemoteAddressRequestWrapper.java.html"><i>View Source</i></a>
 * </p>
 *
 * @author 5jxiang
 * @version $Id$
 */
public class RemoteAddressRequestWrapper extends HttpServletRequestWrapper {
        //~ Static fields/initializers =============================================

        private static final Log log = LogFactory.getLog(RemoteAddressRequestWrapper.class);

        private static final String ADDRESS_HEADER = "X-Forwarded-For";
        private static final String CDN_ADDRESS_HEADER = "Cdn-Src-Ip";

        private static final Pattern IP_ADDRESS = Pattern.compile("^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$");

        //~ Instance fields ========================================================

        private String remoteAddress;

        //~ Constructors ===========================================================

        public RemoteAddressRequestWrapper(HttpServletRequest request) {
                super(request);
        }

        //~ Methods ================================================================

        /*
         * @see javax.servlet.ServletRequestWrapper#getRemoteAddr()
         */
        @Override
        public String getRemoteAddr() {
                if (remoteAddress == null) {
                        remoteAddress = super.getRemoteAddr();

                        if (remoteAddress == null ||
                                        remoteAddress.startsWith("192.168.") ||
                                        "127.0.0.1".equals(remoteAddress) ||
                                        remoteAddress.startsWith("10.")) {
                                String ip = getAddressFromHeader((HttpServletRequest) getRequest());

                                if (log.isInfoEnabled()) {
                                        log.info("Remote ip address from X-Forwarded-For: " + ip);
                                }

                                if (ip != null) {
                                        remoteAddress = ip;
                                }
                        }
                }
                return remoteAddress;
        }

    /**
         * @param request
         * @return
         */
        private static String getAddressFromHeader(HttpServletRequest request) {
                String cdnSrcIp = request.getHeader(CDN_ADDRESS_HEADER);

                if (cdnSrcIp != null) {
                        return cdnSrcIp;
                }

                String forwardedFor = request.getHeader(ADDRESS_HEADER);

                if (log.isInfoEnabled()) {
                        log.info("X-Forwarded-For Header value: " + forwardedFor);
                }

                if (forwardedFor == null) {
                        return null;
                }

                String[] parts = StringUtils.split(forwardedFor, ",");
                for (int i = 0; i < parts.length; i++) {
                        String addr = StringUtils.trim(parts[i]);

                        if (addr.startsWith("192.168.") || addr.startsWith("10.")) {
                                continue;
                        }

                        Matcher matcher = IP_ADDRESS.matcher(addr);

                if (matcher.find()) {
                        return addr;
                }
                }

                return null;
        }

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多