UserAgent情報取得機能サンプル¶
重要
本サンプルは、Nablarch 1.4系に準拠したAPIを使用している。
Nablarch 1.4系より新しいNablarchと組み合わせる場合は、必要に応じてカスタマイズすること。
概要¶
UserAgent情報取得機能はHTTPヘッダ(User-Agent)より取得した値を設定ファイルに記述された内容に従って解析を行い、以下の情報を取得する。
- OSタイプ
- OS名称
- OSバージョン
- ブラウザタイプ
- ブラウザ名称
- ブラウザバージョン
アプリケーションからは、HttpRequest#getUserAgent()
により取得できる。
構成¶
クラス図¶
各クラスの責務¶
インタフェース定義¶
クラス名 | 概要 |
---|---|
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解析クラスの設定¶
設定内容詳細¶
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の場合に行う処理
}
}