web-dev-qa-db-ja.com

OSやブラウザなどのクライアント情報を取得するにはどうすればよいですか

JSP、サーブレットを使用してWebアプリケーションを開発しています。

クライアントがウェブサイトを使用しているときはいつでも、オペレーティングシステム、ブラウザ、解像度などのクライアント情報を取得したい。

51
Chan Tee

最善の策はUser-Agentヘッダーです。 JSPまたはサーブレットでこのように取得できますが、

String userAgent = request.getHeader("User-Agent");

ヘッダーは次のようになります。

User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.13) Gecko/2009073021 Firefox/3.0.13

ブラウザの詳細情報を提供します。ただし、ほとんど自由形式なので、すべてを解読することは非常に困難です。サポートするブラウザを特定し、それぞれのパーサーを記述するだけです。ブラウザのバージョンを特定しようとするときは、常に新しいバージョンを最初に確認してください。たとえば、IE6ユーザーエージェントには、下位互換性のためにIE5が含まれる場合があります。最初にIE5をチェックすると、IE6もIE5に分類されます。

このWebサイトからすべてのユーザーエージェント値の完全なリストを取得できます。

http://www.user-agents.org/

User-Agentを使用すると、ブラウザーの正確なバージョンを確認できます。 OSについてはかなり良いアイデアを得ることができますが、同じOSの異なるバージョンを区別できない場合があります。たとえば、Windows NTと2000は同じUser-Agentを使用する場合があります。

解決については何もありません。ただし、これはAJAX呼び出しでJavascriptを使用して取得できます。

55
ZZ Coder

Javaでは、ブラウザおよびOS関連の情報を直接取得する方法はありません。

ただし、これを入手するには、サードパーティ製のツールをいくつか使用できます。

サードパーティのツールを信頼する代わりに、parseser agentをお勧めします。

String  browserDetails  =   request.getHeader("User-Agent");

これにより、要件に応じてブラウザーの詳細とOS関連の情報を簡単に分離できます。 PFB参照用のスニペット。

        String  browserDetails  =   request.getHeader("User-Agent");
        String  userAgent       =   browserDetails;
        String  user            =   userAgent.toLowerCase();

        String os = "";
        String browser = "";

        log.info("User Agent for the request is===>"+browserDetails);
        //=================OS=======================
         if (userAgent.toLowerCase().indexOf("windows") >= 0 )
         {
             os = "Windows";
         } else if(userAgent.toLowerCase().indexOf("mac") >= 0)
         {
             os = "Mac";
         } else if(userAgent.toLowerCase().indexOf("x11") >= 0)
         {
             os = "Unix";
         } else if(userAgent.toLowerCase().indexOf("Android") >= 0)
         {
             os = "Android";
         } else if(userAgent.toLowerCase().indexOf("iphone") >= 0)
         {
             os = "IPhone";
         }else{
             os = "UnKnown, More-Info: "+userAgent;
         }
         //===============Browser===========================
        if (user.contains("msie"))
        {
            String substring=userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0];
            browser=substring.split(" ")[0].replace("MSIE", "IE")+"-"+substring.split(" ")[1];
        } else if (user.contains("safari") && user.contains("version"))
        {
            browser=(userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]).split("/")[0]+"-"+(userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
        } else if ( user.contains("opr") || user.contains("opera"))
        {
            if(user.contains("opera"))
                browser=(userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]).split("/")[0]+"-"+(userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
            else if(user.contains("opr"))
                browser=((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]).replace("/", "-")).replace("OPR", "Opera");
        } else if (user.contains("chrome"))
        {
            browser=(userAgent.substring(userAgent.indexOf("Chrome")).split(" ")[0]).replace("/", "-");
        } else if ((user.indexOf("mozilla/7.0") > -1) || (user.indexOf("netscape6") != -1)  || (user.indexOf("mozilla/4.7") != -1) || (user.indexOf("mozilla/4.78") != -1) || (user.indexOf("mozilla/4.08") != -1) || (user.indexOf("mozilla/3") != -1) )
        {
            //browser=(userAgent.substring(userAgent.indexOf("MSIE")).split(" ")[0]).replace("/", "-");
            browser = "Netscape-?";

        } else if (user.contains("firefox"))
        {
            browser=(userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-");
        } else if(user.contains("rv"))
        {
            browser="IE-" + user.substring(user.indexOf("rv") + 3, user.indexOf(")"));
        } else
        {
            browser = "UnKnown, More-Info: "+userAgent;
        }
        log.info("Operating System======>"+os);
        log.info("Browser Name==========>"+browser);
53
lambodar

Bitwalker useragentutilsライブラリを使用できます: https://github.com/HaraldWalker/user-agent-utils 。ブラウザに関する情報(名前、タイプ、バージョン、製造元など)およびオペレーティングシステムに関する情報を提供します。それについての良いところは、それが維持されていることです。私が提供したリンクにアクセスして、使用するためにプロジェクトに追加する必要があるMaven依存関係を確認します。

ブラウザ名とブラウザバージョンを返す以下のサンプルコードを参照してください。

    UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
    Browser browser = userAgent.getBrowser();

    String browserName = browser.getName();
    //or 
    // String browserName = browser.getGroup().getName();
    Version browserVersion = userAgent.getBrowserVersion();
    System.out.println("The user is using browser " + browserName + " - version " + browserVersion);
13
Denisa

ブラウザは、この情報をHTTPヘッダーで送信します。一部のコードについては、Tomcatの スヌープの例 を参照してください( sourceonline demo )。

この情報は信頼できないことに注意してください。ブラウザは、彼らが誰であり、どのOSで動作するかについて嘘をつくことができます。

6
Aaron Digulla

ユーザーエージェント文字列の解析には、悪くないライブラリが2つあります。

5
tworec

このコードは最も投票された質問に基づいていますが、私は使いやすいかもしれません

public enum OS {

    WINDOWS,
    MAC,
    LINUX,
    Android,
    IPHONE,
    UNKNOWN;

    public static OS valueOf(HttpServletRequest request) {

        final String userAgent = request.getHeader("User-Agent");
        final OS toReturn;

        if (userAgent == null || userAgent.isEmpty()) {
            toReturn = UNKNOWN;
        } else if (userAgent.toLowerCase().contains("windows")) {
            toReturn = WINDOWS;
        } else if (userAgent.toLowerCase().contains("mac")) {
            toReturn = MAC;
        } else if (userAgent.toLowerCase().contains("x11")) {
            toReturn = LINUX;
        } else if (userAgent.toLowerCase().contains("Android")) {
            toReturn = Android;
        } else if (userAgent.toLowerCase().contains("iphone")) {
            toReturn = IPHONE;
        } else {
            toReturn = UNKNOWN;
        }

        return toReturn;
    }

}
0
Tk421

これは、今日現在、いくつかの最新のブラウザーで動作する私のコードです。

当然、User-Agentが進化するにつれて壊れますが、簡単で修正も簡単です。

    String userAgent = "Unknown";
    String osType = "Unknown";
    String osVersion = "Unknown";
    String browserType = "Unknown";
    String browserVersion = "Unknown";
    String deviceType = "Unknown";

    try {
        userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36 OPR/60.0.3255.165";
        //userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0";
        //userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36";
        //userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134";
        //userAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Mobile/15E148 Safari/604.1";
        boolean exceptionTest = false;
        if(exceptionTest) throw new Exception("EXCEPTION TEST");

        if (userAgent.indexOf("Windows NT") >= 0) {
            osType = "Windows";
            osVersion = userAgent.substring(userAgent.indexOf("Windows NT ")+11, userAgent.indexOf(";"));

        } else if (userAgent.indexOf("Mac OS") >= 0) {
            osType = "Mac";
            osVersion = userAgent.substring(userAgent.indexOf("Mac OS ")+7, userAgent.indexOf(")"));

            if(userAgent.indexOf("iPhone") >= 0) {
                deviceType = "iPhone";
            } else if(userAgent.indexOf("iPad") >= 0) {
                deviceType = "iPad";
            }

        } else if (userAgent.indexOf("X11") >= 0) {
            osType = "Unix";
            osVersion = "Unknown";

        } else if (userAgent.indexOf("Android") >= 0) {
            osType = "Android";
            osVersion = "Unknown";
        }
        logger.trace("end of os section");

        if (userAgent.contains("Edge/")) {
            browserType = "Edge";
            browserVersion = userAgent.substring(userAgent.indexOf("Edge")).split("/")[1];

        } else if (userAgent.contains("Safari/") && userAgent.contains("Version/")) {
            browserType = "Safari";
            browserVersion = userAgent.substring(userAgent.indexOf("Version/")+8).split(" ")[0];

        } else if (userAgent.contains("OPR/") || userAgent.contains("Opera/")) {
            browserType = "Opera";
            browserVersion = userAgent.substring(userAgent.indexOf("OPR")).split("/")[1];

        } else if (userAgent.contains("Chrome/")) {
            browserType = "Chrome"; 
            browserVersion = userAgent.substring(userAgent.indexOf("Chrome")).split("/")[1];
            browserVersion = browserVersion.split(" ")[0];

        } else if (userAgent.contains("Firefox/")) {
            browserType = "Firefox"; 
            browserVersion = userAgent.substring(userAgent.indexOf("Firefox")).split("/")[1];
        }            
        logger.trace("end of browser section");

    } catch (Exception ex) {
        logger.error("ERROR: " +ex);            
    }

    logger.debug(
              "\n userAgent: " + userAgent
            + "\n osType: " + osType
            + "\n osVersion: " + osVersion
            + "\n browserType: " + browserType
            + "\n browserVersion: " + browserVersion
            + "\n deviceType: " + deviceType
            );

ロガー出力:

 userAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36 OPR/60.0.3255.165
 osType: Windows
 osVersion: 10.0
 browserType: Opera
 browserVersion: 60.0.3255.165
 deviceType: Unknown
0
BobC

この情報を確実に取得することはできません。ここで提供されるいくつかの回答の基礎は、HTTP要求のUser-Agentヘッダーを調べることです。ただし、User-Agentヘッダーの情報が真実かどうかを知る方法はありません。要求を送信するクライアントは、そのヘッダーに何でも書き込むことができます。そのため、そのコンテンツはスプーフィングされるか、まったく送信されない可能性があります。

0
Raedwald