Wicket Browser の情報を取得する


Wicket の、Websession には、getClientInfo() というメソッドがあり、Browser の情報が取得できます。
Example で 実装されていた ClinetInfo 取得の実装が興味深かったので、少し突っ込んて調べてみました。


参考


前提

Wicket の version は以下になります。

    <!-- WICKET DEPENDENCIES -->
    <dependency>
        <groupId>org.apache.wicket</groupId>
        <artifactId>wicket-core</artifactId>
        <version>7.8.0</version>
    </dependency>


デフォルトで取得できる Browser 情報について

Page クラスの onInitialize() で以下のように記述します。

  • Page クラスの実装抜粋

        WebClientInfo w = WebSession.get().getClientInfo();
        ClientProperties cp = w.getProperties();
        System.out.println("#############################################################");
        System.out.println(cp.toString());
        System.out.println("###########");
    
    Chrome でアクセスすると以下が標準出力されます。
    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
    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 で、描画サイズを変える等の用途の参考になるかと思いました。

以上です。

コメント

カテゴリー