HttpUtil 获取设备信息

import com.alibaba.fastjson.JSON;
import eu.bitwalker.useragentutils.OperatingSystem;
import eu.bitwalker.useragentutils.UserAgent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpMethod;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.RequestMatcher;
import org.springframework.util.StringUtils;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by tomas on 2017/6/4.
 */

public class HttpUtil {

    public  static List<RequestMatcher> ignoreRequest = new ArrayList<>();

    private static final Logger logger = LoggerFactory.getLogger(HttpUtil.class);

    public static void ok(HttpServletRequest request, HttpServletResponse response) {
        responseOutWithJson(request, response, APIResult.ok());
    }
    public static void error(HttpServletRequest request, HttpServletResponse response, BaseCode code) {
        if(code.getCode() == APICode._C_OK){
            responseOutWithJson(request,response, APIResult.ok());
        }else {
            responseOutWithJson(request,response, APIResult.error(code));
        }
    }
    public static void responseOutWithJson(HttpServletRequest request, HttpServletResponse response, Object data) {
        //将实体对象转换为JSON Object转换
        processHeader(request, response);
        PrintWriter out = null;
        try {
            out = response.getWriter();
            out.append(JSON.toJSONString(data));
            logger.info("url= {} 返回JSON ={} ",request.getRequestURI(), JSON.toJSONString(data));
        } catch (IOException e) {
            logger.error("request ={} 返回 失败 e={}" ,request.getRequestURI(),e);
        } finally {
            if (out != null) {
                out.close();
            }
        }
    }

    public static void processHeader(HttpServletRequest request, HttpServletResponse response) {
        String origin = request.getHeader("Origin");
        String headers = request.getHeader("Access-Control-Request-Headers");
        if (!StringUtils.isEmpty(headers)) {
            headers = ", " + headers;
        } else {
            headers = "";
        }

        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Content-Type", "application/json;charset=UTF-8");

        if (!StringUtils.isEmpty(origin)) {
            response.setHeader("Access-Control-Allow-Origin", origin);
            response.setHeader("Access-Control-Allow-Methods", "GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE, PATCH");
            response.setHeader("Access-Control-Allow-Headers", "Origin, X-Token, Authentication, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-control "+headers);
            response.setHeader("Access-Control-Allow-Credentials", "true");
        }
    }

    public static void delCookies(HttpServletRequest request, HttpServletResponse response, String...  cookies) {
        for (String cookieName : cookies) {
            Cookie cookie = new Cookie(cookieName, null);
            String cookiePath = request.getContextPath();
            if (!StringUtils.hasLength(cookiePath)) {
                cookiePath = "/";
            }
            cookie.setPath(cookiePath);
            cookie.setMaxAge(0);
            response.addCookie(cookie);
        }
    }

    public static void antMatchers(HttpMethod httpMethod, String... antPatterns) {
        String method = httpMethod == null?null:httpMethod.toString();
        List<RequestMatcher> matchers = new ArrayList();
        String[] patterns = antPatterns;
        int length = antPatterns.length;

        for(int i = 0; i < length; ++i) {
            String pattern = patterns[i];
            matchers.add(new AntPathRequestMatcher(pattern, method));
        }
        ignoreRequest.addAll(matchers);
    }
    public static RequestMatcher[] getMatchersArray() {
       return ignoreRequest.toArray(new RequestMatcher[ignoreRequest.size()]);
    }


    /**
     * 获取请求basePath
     */
    public static String getBasePath(HttpServletRequest request) {
        StringBuffer basePath = new StringBuffer();
        String scheme = request.getScheme();
        String domain = request.getServerName();
        int port = request.getServerPort();
        basePath.append(scheme);
        basePath.append("://");
        basePath.append(domain);
        if("http".equalsIgnoreCase(scheme) && 80 != port) {
            basePath.append(":").append(String.valueOf(port));
        } else if("https".equalsIgnoreCase(scheme) && port != 443) {
            basePath.append(":").append(String.valueOf(port));
        }
        return basePath.toString();
    }


    /**
     * 获取请求主机  真实IP
     * @param request
     * @return
     */
    public static String getClientIp(HttpServletRequest request) {
        // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
        String ip = request.getHeader("X-Forwarded-For");
        if (logger.isInfoEnabled()) {
            logger.info("getIpAddress(HttpServletRequest) - X-Forwarded-For - String ip=" + ip);
        }

        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
            if (logger.isInfoEnabled()) {
                logger.info("getIpAddress(HttpServletRequest) - Proxy-Client-IP - String ip=" + ip);
            }
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
            if (logger.isInfoEnabled()) {
                logger.info("getIpAddress(HttpServletRequest) - WL-Proxy-Client-IP - String ip=" + ip);
            }
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
            if (logger.isInfoEnabled()) {
                logger.info("getIpAddress(HttpServletRequest) - HTTP_CLIENT_IP - String ip=" + ip);
            }
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            if (logger.isInfoEnabled()) {
                logger.info("getIpAddress(HttpServletRequest) - HTTP_X_FORWARDED_FOR - String ip=" + ip);
            }
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
            if (logger.isInfoEnabled()) {
                logger.info("getIpAddress(HttpServletRequest) - getRemoteAddr - String ip=" + ip);
            }
        }


        return ip.split(",")[0];
    }


    /**
     * 根据IP获取MAC地址
     * @param request
     * @return
     */
    public static String getMacAddrByIp(HttpServletRequest request) {
        String ip = getClientIp(request);
        String macAddr = null;
        try {
            Process process = Runtime.getRuntime().exec("nbtstat -a " + ip);
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(process.getInputStream()));
            Pattern pattern = Pattern.compile("([A-F0-9]{2}-){5}[A-F0-9]{2}");
            Matcher matcher;
            for (String strLine = br.readLine(); strLine != null;
                 strLine = br.readLine()) {
                matcher = pattern.matcher(strLine);
                if (matcher.find()) {
                    macAddr = matcher.group();
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return macAddr;
    }

    /**
     * 获取系统版本信息
     * @param request
     * @return
     */
    public static String getSystemInfo(HttpServletRequest request){
        String systenInfo = null;
        String header = request.getHeader("user-agent");
        logger.info("获取系统版本信息:"+header);
        if(header == null || header.equals("")){
            return "";
        }


        //得到用户的操作系统
        if (header.indexOf("NT 6.0") > 0){
            systenInfo = "Windows Vista/Server 2008";
        } else if (header.indexOf("NT 5.2") > 0){
            systenInfo = "Windows Server 2003";
        } else if (header.indexOf("NT 5.1") > 0){
            systenInfo = "Windows XP";
        } else if (header.indexOf("NT 6.0") > 0){
            systenInfo = "Windows Vista";
        } else if (header.indexOf("NT 6.1") > 0){
            systenInfo = "Windows 7";
        } else if (header.indexOf("NT 6.2") > 0){
            systenInfo = "Windows Slate";
        } else if (header.indexOf("NT 6.3") > 0){
            systenInfo = "Windows 9";
        } else if (header.indexOf("NT 5") > 0){
            systenInfo = "Windows 2000";
        } else if (header.indexOf("NT 4") > 0){
            systenInfo = "Windows NT4";
        } else if (header.indexOf("Me") > 0){
            systenInfo = "Windows Me";
        } else if (header.indexOf("98") > 0){
            systenInfo = "Windows 98";
        } else if (header.indexOf("95") > 0){
            systenInfo = "Windows 95";
        } else if (header.indexOf("Mac") > 0){
            systenInfo = "Mac";
        } else if (header.indexOf("Unix") > 0){
            systenInfo = "UNIX";
        } else if (header.indexOf("Linux") > 0){
            systenInfo = "Linux";
        } else if (header.indexOf("SunOS") > 0){
            systenInfo = "SunOS";
        }
        return systenInfo;
    }

    public static UserAgent getUserAgent(String userAgentStr){
        return UserAgent.parseUserAgentString(userAgentStr);
    }

    /**
     * 获取设备类型
     * @param userAgentStr
     * @return
     */
    public static String getDeviceType(String userAgentStr) {
        if(StringUtils.isEmpty(userAgentStr)){
            return null;
        }

        UserAgent userAgent = getUserAgent(userAgentStr);

        //获取操作系统对象
        OperatingSystem operatingSystem = userAgent.getOperatingSystem();

        //获取设备类型
        return operatingSystem.getDeviceType().toString();

    }

    /**
     * 获取厂商
     * @param userAgentStr
     * @return
     */
    public static String getDeviceMfrs(String userAgentStr) {
        if(StringUtils.isEmpty(userAgentStr)){
            return null;
        }

        UserAgent userAgent = getUserAgent(userAgentStr);

        //获取操作系统对象
        OperatingSystem operatingSystem = userAgent.getOperatingSystem();

        //获取厂商
        return operatingSystem.getManufacturer().toString();

    }

    /**
     * 操作系统名称
     * @param userAgentStr
     * @return
     */
    public static String getDeviceName(String userAgentStr) {
        if(StringUtils.isEmpty(userAgentStr)){
            return null;
        }

        UserAgent userAgent = getUserAgent(userAgentStr);

        //获取操作系统对象
        OperatingSystem operatingSystem = userAgent.getOperatingSystem();

        //操作系统名称
        return operatingSystem.getName();
    }

    /**
     * 获取设备类型
     * @param userAgentStr
     * @return
     */
    public static String getDeviceModel(String userAgentStr) {
        if(StringUtils.isEmpty(userAgentStr)){
            return null;
        }

        UserAgent userAgent = getUserAgent(userAgentStr);

        //获取操作系统对象
        OperatingSystem operatingSystem = userAgent.getOperatingSystem();
        //操作系统名称
        String osName = operatingSystem.getName();
        //获取设备类型
        String deviceType = operatingSystem.getDeviceType().toString();

        //获取设备型号
        if ("MOBILE".equals(deviceType))
        {
            String split[] = userAgentStr.split("Build/");

            if(split!=null || split.length > 0)
            {
                String splitType[] =  split[0].split(";");
                if(splitType!=null && splitType.length>0)
                {
                    return splitType[splitType.length-1];
                }

            }

        }
        else if ("TABLET".equals(deviceType))
        {
            String split[] = userAgentStr.split("Build/");

            if(split!=null || split.length > 0)
            {
                String splitType[] =  split[0].split(";");
                if(splitType!=null && splitType.length>0)
                {
                    return splitType[splitType.length-1];
                }

            }
        }

        return osName;
    }
}
原文地址:https://www.cnblogs.com/lc0605/p/11356190.html