Wicket の、Websession には、getClientInfo()
というメソッドがあり、Browser の情報が取得できます。
Example で 実装されていた ClinetInfo 取得の実装が興味深かったので、少し突っ込んて調べてみました。
参考
-
Getting Browser Information - Apache Wicket - Apache Software Foundation
-
Browser Info
Browser 情報を取得する Example クラス -
Ajax Browser Info
Ajax で Browser 情報を取得する Example クラス
前提
Wicket の version は以下になります。
<!-- WICKET DEPENDENCIES -->
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-core</artifactId>
<version>7.8.0</version>
</dependency>
デフォルトで取得できる Browser 情報について
Page クラスの onInitialize()
で以下のように記述します。
-
Page クラスの実装抜粋
Chrome でアクセスすると以下が標準出力されます。WebClientInfo w = WebSession.get().getClientInfo(); ClientProperties cp = w.getProperties(); System.out.println("#############################################################"); System.out.println(cp.toString()); System.out.println("###########");
Browser が何であるか、browser version 等の基本情報が出力されます。 -
コンソール出力
############################################################# browserInternetExplorer=false browserKonqueror=false browserMozilla=false browserMozillaFirefox=false browserOpera=false browserSafari=false browserChrome=true browserEdge=false browserVersionMajor=61 browserVersionMinor=0 navigatorCookieEnabled=false navigatorJavaEnabled=false remoteAddress=127.0.0.1 javaScriptEnabled=false ###########
拡張属性取得をONにする
Application クラス内で、
RequestCycleSettings()#setGatherExtendedBrowserInfo()
にtrue
を設定します。
これで Browser の拡張属性情報が取得できるようになります。
-
Applicationクラス内の記述の抜粋
// Browserの拡張属性を取得する getRequestCycleSettings().setGatherExtendedBrowserInfo(true);
-
Page クラスの実装
Pageクラスの実装は、通常の取得方法と同様です。
特に変わりはありません。
この状態だと、セッションが確立されていない場合、BrowserInfoPage
にリダイレクトされ、Broswerの拡張属性を取得し、元の画面へ自動で戻る動作となります。
以下、表示されるページのイメージになります。
- BrowserInfoPage
こちらは、exampleでも使われていますので、そちらが最も参考になるかと思います。
Browser Info
BrowserInfoPageから戻ってきた際のコンソール出力は以下の通りでした。
Exampleの出力とは異なり、通常のデータ状態で取得されています。
こちら原因まではわかりませんでした。
何か設定が足りないのかと思われます。
#############################################################
browserInternetExplorer=false
browserKonqueror=false
browserMozilla=false
browserMozillaFirefox=false
browserOpera=false
browserSafari=false
browserChrome=true
browserEdge=false
browserVersionMajor=61
browserVersionMinor=0
navigatorCookieEnabled=false
navigatorJavaEnabled=false
remoteAddress=127.0.0.1
javaScriptEnabled=false
###########
BrowserInfoPage を介さないで、Browserの拡張属性情報を取得する
Ajax Browser Info 内で使われている wicket/AjaxClientInfoBehavior.java at master · apache/wicket を拡張属性を取得したいページにAddすることで、拡張属性が取得できるようになります。
AjaxClientInfoBehavior.java
が ページ描画後に、非同期通信で ClientInfo を生成するため Page#onInitialize()
のシーケンスでのClientInfoの取得はできません。
From の submit 時に、拡張属性を取得したいケースの場合はこの方法で事足りるかと思います。
Page クラスのonInitialize()
で以下のように記述します。
- Page クラスの実装抜粋
add(new AjaxClientInfoBehavior());
Button の onSubmit()
で以下のように記述します。
- ButtonのonSubmit()タグに以下のように記述します。
@Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { ................. WebClientInfo w = WebSession.get().getClientInfo(); ClientProperties cp = w.getProperties(); System.out.println("#############################################################"); System.out.println(cp.toString()); System.out.println("###########"); ................. }
実行後に、標準出力の結果は以下になります。
こちらは拡張属性が取得できています。
#############################################################
browserHeight=691
browserInternetExplorer=false
browserKonqueror=false
browserMozilla=false
browserMozillaFirefox=false
browserOpera=false
browserSafari=false
browserChrome=true
browserEdge=false
browserVersionMajor=61
browserVersionMinor=0
browserWidth=1245
navigatorCookieEnabled=true
navigatorJavaEnabled=false
navigatorAppCodeName=Mozilla
navigatorAppName=Netscape
navigatorAppVersion=5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36
navigatorLanguage=ja
navigatorPlatform=MacIntel
navigatorUserAgent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36
remoteAddress=127.0.0.1
screenColorDepth=24
screenHeight=900
screenWidth=1440
utcDSTOffset=9
utcOffset=9
hostname=127.0.0.1
javaScriptEnabled=false
###########
どのように拡張属性を取得しているか?
AjaxClientInfoBehavior.java
等は、wicket/wicket-browser-info.js at master · apache/wicket を内部で使用して、javascript 経由で、属性情報を取得し、それをサーバー側に post しています。
デスクトップアプリのような挙動を実現するために必要な機能なのかもしれません。
windowsize で、描画サイズを変える等の用途の参考になるかと思いました。
以上です。
コメント