1. 程式人生 > >獲取UserAgent資訊工具類

獲取UserAgent資訊工具類

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

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cz.mallat.uasparser.OnlineUpdater;
import cz.mallat.uasparser.UASparser;
import cz.mallat.uasparser.UserAgentInfo;

/**
 *	UserAgent獲取和解析工具類,jdk1.7及以上版本支援  
 */
public class UserAgentUtil {
	private static final Logger LOG = LoggerFactory.getLogger(UserAgentUtil.class);
	private static UASparser uasParser = null;  
    public static String android="Android";    
    public static String iphone="iPhone";    
    public static String ipad="iPad";  
    public static final String noDevice="未知裝置";  
    
    // \b 是單詞邊界(連著的兩個(字母字元 與 非字母字元) 之間的邏輯上的間隔),    
   // 字串在編譯時會被轉碼一次,所以是 "\\b"    
   // \B 是單詞內部邏輯間隔(連著的兩個字母字元之間的邏輯上的間隔)    
   private static String phoneReg = "\\b(ip(hone|od)|android|opera m(ob|in)i"    
           +"|windows (phone|ce)|blackberry"    
           +"|s(ymbian|eries60|amsung)|p(laybook|alm|rofile/midp"    
           +"|laystation portable)|nokia|fennec|htc[-_]"    
           +"|mobile|up.browser|[1-4][0-9]{2}x[1-4][0-9]{2})\\b";    
   private static String tableReg = "\\b(ipad|tablet|(Nexus 7)|up.browser"    
           +"|[1-4][0-9]{2}x[1-4][0-9]{2})\\b";    
      
   //移動裝置正則匹配:手機端、平板  
   private static Pattern phonePat = Pattern.compile(phoneReg, Pattern.CASE_INSENSITIVE);    
   private static Pattern tablePat = Pattern.compile(tableReg, Pattern.CASE_INSENSITIVE);  
    
    static {  
        try {  
            uasParser = new UASparser(OnlineUpdater.getVendoredInputStream());  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
	
    /** 
     * 檢測是否是移動裝置訪問 
     *  
     * @Title: check 
     * @param userAgent 瀏覽器標識 
     * @return true:移動裝置接入,false:pc端接入 
     */  
    public static boolean checkMobileOrPC(HttpServletRequest request){   
    	String userAgent=request.getHeader("user-agent").toLowerCase();
    	System.out.println("==========================終端判斷開始========================================");
        System.out.println("裝置檢測:"+userAgent);
        // 匹配    
        Matcher matcherPhone = phonePat.matcher(userAgent);    
        Matcher matcherTable = tablePat.matcher(userAgent); 
        boolean result=false;
        if(matcherPhone.find() || matcherTable.find()){    
        	result = true;    
        }
        System.out.println("===========================終端判斷結束=======================================");
        return result;
    }  
    
    /** 
     * 檢測是否是移動裝置訪問 
     *  
     * @Title: check 
     * @param userAgent 瀏覽器標識 
     * @return true:移動裝置接入,false:pc端接入 
     */  
    public static boolean checkMobileOrPC(String userAgent){   
        System.out.println("裝置檢測:"+userAgent);
        // 匹配    
        Matcher matcherPhone = phonePat.matcher(userAgent);    
        Matcher matcherTable = tablePat.matcher(userAgent);    
        if(matcherPhone.find() || matcherTable.find()){    
            return true;    
        } else {    
            return false;    
        }    
    }  
    
	/**
	 * 裝置型別     Smartphone/Personal computer
	 * @param userAgent
	 * @return
	 * @throws IOException 
	 */
	public static String getDeviceType(HttpServletRequest request) throws IOException{
		String userAgent=request.getHeader("user-agent").toLowerCase();
		UserAgentInfo userAgentInfo = UserAgentUtil.uasParser.parse(userAgent);
		LOG.debug("裝置型別:" + userAgentInfo.getDeviceType());  
		return userAgentInfo.getDeviceType();
	}	
    
	/**
	 * 作業系統名稱    Android/Windows/iOS
	 * @param userAgent
	 * @return
	 * @throws IOException 
	 */
	public static String getOsName(HttpServletRequest request) throws IOException{
		String userAgent=request.getHeader("user-agent").toLowerCase();
		UserAgentInfo userAgentInfo = UserAgentUtil.uasParser.parse(userAgent);
		LOG.debug("作業系統詳細名稱:" + userAgentInfo.getOsName());  
		return userAgentInfo.getOsName();
	}	
	
	/**
	 * 瀏覽器名稱和版本      Chrome Mobile 53.0.2785.146/Chrome 63.0.3239.84/Android browser 4.0
	 * @param userAgent
	 * @return
	 * @throws IOException 
	 */
	public static String getUaName(HttpServletRequest request) throws IOException{
		String userAgent=request.getHeader("user-agent").toLowerCase();
		UserAgentInfo userAgentInfo = UserAgentUtil.uasParser.parse(userAgent);
		LOG.debug("瀏覽器名稱和版本:" + userAgentInfo.getUaName());  
		return userAgentInfo.getUaName();
	}		
     
	/**
	 * 檢查是否是微信瀏覽器 
	 * @param request
	 * @return
	 */
	public static boolean isWeChatBrowser(HttpServletRequest request){
		String userAgent=request.getHeader("user-agent").toLowerCase();
		return userAgent.toLowerCase().indexOf("micromessenger")>-1?true:false;
	}
	
	/**
	 * 獲取手機型號     ios和ipad不判斷具體型號
	 * @param request
	 * @return
	 */
	public static String getMobileModel(HttpServletRequest request){
		String userAgent=request.getHeader("user-agent").toLowerCase();
		//獲取手機型號開始**************************************************************************
		// 獲取Android手機型號
		Pattern pattern = Pattern.compile(";\\s?(\\S*?\\s?\\S*?)\\s?(Build)?/");
		Matcher matcher = pattern.matcher(userAgent);
		String mobileModel = null;
		if (matcher.find()) {
			mobileModel = matcher.group(1).trim();
		}

		// 判斷iphone和ipad
		if (userAgent.indexOf("iphone") > 0) {
			mobileModel = "iphone";
		}
		if (userAgent.indexOf("ipad") > 0) {
			mobileModel = "ipad";
		}
		//獲取手機型號結束**************************************************************************
		return mobileModel;
	}
	
	/**
	 * 瀏覽器型別       Mobile Browser/Browser
	 * @param userAgent
	 * @return
	 * @throws IOException 
	 */
	public static String getBrowerType(HttpServletRequest request) throws IOException{
		String userAgent=request.getHeader("user-agent").toLowerCase();
		UserAgentInfo userAgentInfo = UserAgentUtil.uasParser.parse(userAgent);
		LOG.debug("型別:" + userAgentInfo.getType());  
		return userAgentInfo.getType();
	}	    
	
	/**
	 * 瀏覽器版本  Chrome Mobile 53.0.2785.146/Chrome 63.0.3239.84
	 * @param userAgent
	 * @return
	 * @throws IOException 
	 */
	public static String getBrowserVersionInfo(HttpServletRequest request) throws IOException{
		String userAgent=request.getHeader("user-agent").toLowerCase();
		UserAgentInfo userAgentInfo = UserAgentUtil.uasParser.parse(userAgent);
		LOG.debug("瀏覽器版本:" + userAgentInfo.getBrowserVersionInfo());  
		return userAgentInfo.getBrowserVersionInfo();
	}		
	
	/**
	 * 獲取移動使用者作業系統     
	 * @param userAgent
	 * @return
	 */
    public static String getMobileOS(HttpServletRequest request){    
    	String userAgent=request.getHeader("user-agent").toLowerCase();
        if (userAgent.contains(android)) {    
            return android;    
        }else if (userAgent.contains(iphone)){    
            return iphone;    
        }else if (userAgent.contains(ipad)){    
            return ipad;    
        }else {    
            return "others";  
        }    
    }    

	/**
	 * 作業系統家族
	 * @param userAgent
	 * @return
	 * @throws IOException 
	 */
	public static String getOsFamily(HttpServletRequest request) throws IOException{
		String userAgent=request.getHeader("user-agent").toLowerCase();
		UserAgentInfo userAgentInfo = UserAgentUtil.uasParser.parse(userAgent);
		LOG.debug("作業系統家族:" + userAgentInfo.getOsFamily());  
		return userAgentInfo.getOsFamily();
	}
	
	/**
	 * 瀏覽器名稱
	 * @param userAgent
	 * @return
	 * @throws IOException 
	 */
	public static String getUaFamily(HttpServletRequest request) throws IOException{
		String userAgent=request.getHeader("user-agent").toLowerCase();
		UserAgentInfo userAgentInfo = UserAgentUtil.uasParser.parse(userAgent);
		LOG.debug("瀏覽器名稱:" + userAgentInfo.getUaFamily());  
		return userAgentInfo.getUaFamily();
	}	
	
}

需要maven:

<dependency>
	<groupId>cz.mallat.uasparser</groupId>
	<artifactId>uasparser</artifactId>
	<version>0.6.2</version>
</dependency>
<dependency>
	<groupId>net.sourceforge.jregex</groupId>
	<artifactId>jregex</artifactId>
	<version>1.2_01</version>
</dependency>