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; } }