UserAgent情報取得機能サンプル

重要

本サンプルは、Nablarch 1.4系に準拠したAPIを使用している。

Nablarch 1.4系より新しいNablarchと組み合わせる場合は、必要に応じてカスタマイズすること。

概要

UserAgent情報取得機能はHTTPヘッダ(User-Agent)より取得した値を設定ファイルに記述された内容に従って解析を行い、以下の情報を取得する。

  • OSタイプ
  • OS名称
  • OSバージョン
  • ブラウザタイプ
  • ブラウザ名称
  • ブラウザバージョン

アプリケーションからは、HttpRequest#getUserAgent()により取得できる。

ソースコード

構成

クラス図

../../_images/UserAgent_ClassDiagram.png

各クラスの責務

インタフェース定義

クラス名 概要
please.change.me.fw.web.useragent.UserAgentValueConvertor
取得した値(ブラウザ名、バージョン番号等)を変換するインタフェース。

クラス定義

a) nablarch.fw.web.UserAgentParserの実装クラス

クラス名 概要
please.change.me.fw.web.useragent.RegexUserAgentParser
正規表現によりOSおよびブラウザの各種情報を取得するUserAgent解析クラス。

b) nablarch.fw.web.useragent.UserAgentValueConvertorの実装クラス

クラス名 概要
please.change.me.fw.web.useragent.UserAgentNameConvertor
名称項目の整形を行うコンバータ。
任意の文字列を置換する機能を持つ。
please.change.me.fw.web.useragent.UserAgentVersionConvertor
バージョン項目の整形を行うコンバータ。
バージョン項目を分割し、各項目を任意の文字列でパディングする機能を持つ。

c) その他のクラス

クラス名 概要
nablarch.fw.web.HttpRequest
HTTPプロトコルにおけるリクエストメッセージを格納するデータオブジェクト。
アプリケーションでは本クラスの getUserAgent メソッドよりUserAgentクラスを取得する。
nablarch.fw.web.useragent.UserAgent
UserAgent解析クラスにより解析された結果を保持するクラス。
UserAgent解析クラスをカスタマイズし、任意の項目を取得したい場合、本クラスを拡張する。
please.change.me.fw.web.useragent.UserAgentPatternSetting
解析パターンのリストやデフォルト値などの設定項目を保持するクラス。
please.change.me.fw.web.useragent.TypePattern
種別(OS/ブラウザ)を判定するための、解析パターンの正規表現を保持するクラス。
please.change.me.fw.web.useragent.ItemPattern
項目(具体的なブラウザ名等)を判定するための、解析パターンの正規表現やコンバータなどを保持するクラス。

補足

UserAgentVersionConvertorについての補足説明

サンプル提供されているUserAgentValueConvertorクラスの使用用途について説明をする。 本クラスは、文字列を「D(数字以外)」で分割し、それぞれの要素をパディングし、スペース区切りで結合した値を変換値とする。 (例:「34.0.1847.116」→「_34 __0 ___1847」)

なぜこのような変換を行うかというと、変換後のブラウザバージョン番号をCSSクラス名として使用するためである。

ある特定のブラウザ、端末に対してのみ特別な表示制御が必要となることがあるが、この制御を行うのには様々な方法がある。 この制御方法がアプリケーション全体で統一されていなければ、 場当たり的な判定処理、制御処理が散在してしまい保守性が損なわれてしまう。

この制御方法を統一する方法として、「ユーザエージェント値から取得したブラウザバージョン番号をCSSクラス名とし、特定のブラウザ、端末に対する制御はこのCSS指定により行う」という方法を提供する。本クラスは、その表示制御用途に使用することを意図している。

設定の記述

UserAgent情報取得機能は、システムリポジトリ機能を利用して設定を行うことができる。

UserAgent解析クラスの設定

設定内容詳細

please.change.me.fw.web.useragent.RegexUserAgentParserの設定

RegexUserAgentParserの設定例と設定項目詳細は下記の通り。また、UserAgent情報取得機能設定サンプル に、より具体的な設定および利用例を示す。

<?xml version="1.0" encoding="UTF-8"?>
<component-configuration xmlns="http://tis.co.jp/nablarch/component-configuration"
                         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <!-- OSのパターンマッピング設定 -->
  <component name="userAgentParser" class="please.change.me.fw.web.useragent.RegexUserAgentParser">
    <property name="osSetting">
      <component class="please.change.me.fw.web.useragent.UserAgentPatternSetting">
        <!-- OSタイプを取得するためのパターン設定 -->
        <property name="typePatternList">
          <list>
            <component class="please.change.me.fw.web.useragent.TypePattern">
              <property name="name"             value="desktop" />
              <!-- OSタイプの抽出パターン(正規表現) -->
              <property name="pattern"          value="(?i).*(windows|mac os x).*" />
            </component>
          </list>
        </property>
        <!-- OS情報を取得するためのパターン設定 -->
        <property name="itemPatternList">
          <list>

            <component class="please.change.me.fw.web.useragent.ItemPattern">
              <!-- OS情報の抽出パターン(正規表現) -->
              <property name="pattern"          value="(?i).*(windows|mac os x)[\D+]*([\d\._]*).*" />
              <property name="nameIndex"        value="1" />  <!-- 1つ目のキャプチャグループをOS名にする -->
              <property name="versionIndex"     value="2" />  <!-- 2つ目のキャプチャグループをOSバージョンにする -->
              <property name="nameConvertor"    ref="osNameConvertor" />
              <property name="versionConvertor" ref="deviceVersionConvertor" />
            </component>
          </list>
        </property>
      </component>
    </property>
    <property name="browserSetting">
      <component class="please.change.me.fw.web.useragent.UserAgentPatternSetting">
        <property name="typePatternList">
          <list>
            <component class="please.change.me.fw.web.useragent.TypePattern">
              <property name="name"             value="Gecko" />
              <property name="pattern"          value=".*Gecko.*" />
            </component>
          </list>
        </property>
        <property name="itemPatternList">
          <list>
            <component class="please.change.me.fw.web.useragent.ItemPattern">
              <property name="pattern"          value="(?i).*(msie\s|trident.+rv:)([\d\.]*).*" />
              <property name="name"             value="ie" /> <!-- グループインデックスが指定されない場合に使用するブラウザ名 -->
              <property name="versionIndex"     value="2" />
              <property name="versionConvertor" ref="browserVersionConvertor" />
            </component>
          </list>
        </property>
      </component>
    </property>
  </component>
</component-configuration>

RegexUserAgentParserのプロパティ値を以下に示す。

property名 設定内容
osSetting
OS情報の解析パターン設定を定義する。
設定可能な値はUserAgentPatternSettingである。
指定が無い場合、OSに関する情報は全てnullとなる。
browserSetting
ブラウザ情報の解析パターン設定を定義する。
設定可能な値はUserAgentPatternSettingである。
指定が無い場合、ブラウザに関する情報は全てnullとなる。

UserAgentPatternSettingのプロパティ値を以下に示す。

property名 設定内容
defaultType
デフォルトの項目タイプを定義する。
UserAgentがいずれのパターンにもマッチしない場合、または判定中にエラーが発生した場合に使用される。
指定がない場合、項目タイプは”UnknownType”となる。
defaultName
デフォルトの項目名称を定義する。
UserAgentがいずれのパターンにもマッチしない場合、または判定中にエラーが発生した場合に使用される。
指定がない場合、項目名称は”UnknownName”となる。
defaultVersion
デフォルトのバージョンを定義する。
UserAgentがいずれのパターンにもマッチしない場合、または判定中にエラーが発生した場合に使用される。
指定がない場合、バージョンは”UnknownVersion”となる。
typePatternList
UserAgentから項目タイプを取得するための解析パターンをListで定義する。
Listの要素はUserAgentPatternとする。
パターンの解析はこのリストの定義順に行われ、マッチした時点で該当グループの解析を終了する。
指定がない場合、解析が行われない。
itemPatternList
UserAgentから項目名称、バージョンを取得するための解析パターンをListで定義する。
Listの要素はUserAgentPatternとする。
パターンの解析はこのリストの定義順に行われ、マッチした時点で該当グループの解析を終了する。
指定がない場合、解析が行われない。

TypePatternのプロパティ値を以下に示す。

property名 設定内容
name
このパターンの項目名を定義する。
本値は他のパターンと同じ値を設定してもよい。
pattern
解析パターンを正規表現で定義する。
不正なパターンが指定された場合、初期化時にIllegalArgumentExceptionが送出される。

ItemPatternのプロパティ値を以下に示す。

property名 設定内容
name
このパターンの項目名を定義する。
本値は他のパターンと同じ値を設定してもよい。
本値はnameIndexでキャプチャするグループ番号を指定しない場合に使用される。
指定がない場合、項目タイプはdefaultTypeで指定された値となる。
pattern
解析パターンを正規表現で定義する。
nameIndexおよびversionIndexで指定されるグループ番号で値をキャプチャできるようグループを設定する必要がある。
不正なパターンが指定された場合、初期化時にIllegalArgumentExceptionが送出される。
指定がない場合、解析が行われない。
nameIndex
解析パターンから項目名称としてキャプチャするグループ番号を定義する。
不正なインデックスが指定された場合、初期化時にIllegalArgumentExceptionが送出される。
指定がない場合、項目名称は項目タイプと同値となる。
項目タイプも指定されていない場合、defaultNameで指定された値となる。
versionIndex
解析パターンからバージョンとしてキャプチャするグループ番号を定義する。
不正なインデックスが指定された場合、初期化時にIllegalArgumentExceptionが送出される。
指定がない場合、バージョンはdefaultVersionで指定された値となる。
nameConvertor
項目名称抽出後に文字列変換を行うUserAgentValueConvertorの実装クラスを定義する。
標準の実装としてUserAgentNameConvertorが提供される。
UserAgentNameConvertorは、指定された置換前文字列を置換後文字列に単純に置き換える。
また、toLowerCaseプロパティが設定されている場合は置換前に文字列を小文字化する。
例)「mac os x」→「mac_os_x」
指定がない場合、変換を行わない。
versionConvertor
バージョン抽出後に文字列変換を行うUserAgentValueConvertorの実装クラスを定義する。
標準の実装としてUserAgentVersionConvertorが提供される。
UserAgentVersionConvertorは、文字列を「\D(数字以外)」で分割し、3つの要素にする。それぞれの要素をパディングし、スペース区切りで結合した値を変換値とする。
例)「34.0.1847.116」→「_34 __0 ___1847」
指定がない場合、変換を行わない。

UserAgentNameConvertorのプロパティ値を以下に示す。

property名 設定内容
toLowerCase
文字列の小文字化フラグを定義する。
指定がない場合、小文字化を行う。
replaceFrom
置換前文字列を定義する。
replaceTo
置換後文字列を定義する。
replaceFromおよびreplaceToの両方が指定されない場合、変換を行わない。

UserAgentVersionConvertorのプロパティ値を以下に示す。

property名 設定内容
padding
パディング文字列を定義する。
指定がない場合、変換を行わない。

使用例

public HttpResponse doUserAgentJudgment(HttpRequest req, ExecutionContext context) {

    UserAgent userAgent = req.getUserAgent();

    if (userAgent.getOsType().equals("android")) {
        ... // クライアントがandroidの場合に行う処理
    }

    if (userAgent.getBrowserName().equals("chrome")) {
        ... // ブラウザがchromeの場合に行う処理
    }
}