Spring Web Flowによる今どきでないWebアプリケーション開発

こんにちは、サイオステクノロジー技術部 武井です。今回は、JavaのWebアプリケーションフレームワークであるSpring Web Flowについて書きたいと思います。

Spring Web Flowとは?

Spring Web Flowとは画面遷移の記載に特化したフレームワークです。従来のフレームワークでは、画面遷移を制御するためには、コントローラークラスを作成する必要がありました。さらに、ステートフルなデータを扱うためにはサーバーサイドでセッションを生成、適切なタイミングでセッションの破棄などを行う必要がありました。

Webアプリケーションを作成する際、この開発コストは馬鹿になりません。ここで、例えば、ショッピングカートの機能のように複数の画面が遷移する場合を考えてみます。ECサイトなどに代表されるショッピングカートの機能は、一般的には以下のような画面遷移をするのではないでしょうか?

ログイン画面 → 商品選択画面 → 決済方法選択画面 → 購入確認画面 → 購入完了画面

このような処理で、ステートフルなデータ、つまりショッピングカートの中身を維持するのは結構大変です。また、画面ごとにコントローラークラスを作成しなければならず、しかも、画面の遷移がちょっと変わっただけでも、相当なソースコードの変更が求められます。

Spring Web Flowは、そんなメンドクサイ画面遷移の処理から解放してくれます。Spring Web Flowでは、画面遷移は全てXMLで実現をし、コントローラークラスなどは必要ありません。この画面遷移の一連の流れFlowと呼び、基本的にデータ(上記の例で言えばショッピングカートの中身)はFlowが終了するまで維持されます。また、画面の遷移を変更したい場合には、XMLを変更するだけでOKです。

今さらSpring Web Flow?

たくさんのメリットがあるSpring Web Flowですが、今となってはいささか時代遅れな感じが否めないようです。最近のWebアプリケーションの開発の潮流は、できるだけサーバーサイドでデータを持たず、ステートレスであろうとします。画面は、Angularなどのクライアントサイドフレームワークで処理を行い、認証情報や認可情報などはJSON Web Tokenに代表されるような署名付きデータをクライアントのWebストレージに保存します。クライアントに表示するデータは、署名付きデータを認証キーとしてRestfulなAPIサーバーに渡して、データを取得し、画面はクライアント側で生成します。

インフラ側は昨今、AWSやAzureなどに代表されるパブリッククラウドで構築されるケースがよくあると思います。スケールアップではなく、スケールアウトが前提とされるこのようなインフラ環境では、Spring Web Flowのように、サーバーサイドでデータを持つ前提のフレームワークでは、適用が非常に厳しいのかもしれません。

それでも、今回、Spring Web Flowをご紹介するのは、弊社が得意とするシングルサインオンのオープンソースソフトウェアである「Shibboleth」が、Spring Web Flowを採用しているからです。

シングルサインオンは、一回のIDとパスワードの入力で、複数のサービスにログオンできる仕組みです。略してSSOと呼ばれることもあり、本記事でも以上は、SSOとします。

通常のID・パスワード認証であれば、画面遷移は多くても2〜3つなので、あまりSpring Web Flowの恩恵に授かることは少ないですが、その真価を発揮するのは多要素認証のときです。

多要素認証とは、複数の認証を組み合わせて一つの認証として、それら全ての認証にパスしないと、全体的に認証OKとしない仕組みです。昨今のシステムによく導入されているのが、ID・パスワード認証に加えて、ワンタイムパスワード認証を組み合わせるパターンです。もちろん、他の認証も組み合わせて以下のようにすることも可能です。

ID・パスワード認証 → ワンタイムパスワード認証 → 指紋認証 → 声紋認証 → x509認証

もちろん、これは極端な例ですが、このような複数の画面遷移は、先にご紹介したショッピングカートの例に似ていませんでしょうか?多要素認証にするということは、複数の画面が遷移し、認証が最後まで完了するまで、どこまでの認証が完了しているかをサーバー側にステートフルに保持しておく必要があります。このようなケースではSpring Web Flowが大活躍します。

例えば、先程ご紹介した多要素認証の例で、指紋認証の部分を顔認証に変更したいとする場合、従来のWebアプリケーションフレームワークでは、画面遷移を司るコントローラークラスを追加実装する必要がありましたが、Spring Web Flowでは、XMLファイルを修正するだけでOKです。

Shibbolethで多要素認証の設定を行う場合、Spring Web Flowの画面遷移を定義するXMLファイルを修正する必要があり、Spring Web Flowへの理解は必須となります。本記事では、Spring Web Flowで簡単なWebアプリケーションを作成することにより、Spring Web Flowへの理解を深め、Shibbolethでの多要素認証をサクサクできるようになることを目的としております(前置きが非常に長くなりましてすみませんm(_ _)m)。

Spring Web FlowによるWebアプリケーション実装例

掲示板に投稿されたメッセージを検索する簡単なアプリケーションを作成します。画面イメージ及び画面遷移は、下記の通りとします。

掲示板のタイトルを入力して、「検索」をクリックすると、タイトルで検索した検索結果一覧が次の画面に表示されます。

Screen Shot 2018-04-17 at 7.50.39

 

検索結果の一覧画面です。

Screen Shot 2018-04-17 at 7.48.06

本アプリケーションを実装するために、Spring Bootを導入し、画面遷移の部分のみをSpring Web Flowに置き換えます。

さて、いよいよ、実装方法のご説明に入ります。Spring Tool SuiteなどでSpring Bootのプロジェクトを作成し、pom.xmlに以下の記述を追加し、Spring Web Flowの2.4.4を導入します。

        <dependency>
            <groupId>org.springframework.webflow</groupId>
            <artifactId>spring-webflow</artifactId>
            <version>2.4.4.RELEASE</version>
        </dependency>

準備は整いましたので、ソースコードを作成します。今回、作成するべきソースコードの一覧及びディレクトリ構成は以下のとおりです。

Screen Shot 2018-04-17 at 8.24.18

まず、WebFlowConfig.javaです。設定項目が多岐に渡るので、あまり深く考えずに、以下のSpring Web Flowの公式マニュアルに従って作成し、重要な部分のみソースコード内にコメントで記載しております。

https://docs.spring.io/autorepo/docs/webflow/2.4.4.RELEASE/reference/html/system-setup.html

 

掲示板のメッセージを格納するBeanです。掲示板のタイトルと本文を格納するBeanで一般的なコードですので、迷うことはないと思います。

検索画面で入力された検索条件(タイトル)を格納するFormクラスです。こちらもシンプルなコードですので、特に説明は不要かと思います。

検索ボタンがクリックされたときに実行される検索処理です。処理の詳細は、ソースコード内のコメントを参考にして下さい。

画面遷移を定義するFlow定義ファイルです。Spring Web Flowのキモです。

検索条件を入力する画面のテンプレートファイルです。

検索結果を表示する画面のテンプレートファイルです。

これらのソースコードの作成が完了しましたら、アプリケーションを実行してみて下さい。アクセスするURLはFlow定義ファイルが配置された位置によって決まります。今回は、WebFlowConfig.javaにて、templatesというルートを設定し、そこからFlow定義ファイルまでのパスは/bbs/flow-bbs.xmlとなっております。この場合、アクセスするURLは以下のようになります。

http://localhost:8080/bbs
※ localhost:8080は環境によって異なりますが、Spring Tool Suiteで開発したときは一般的にこうなるはずです

上記のURLにアクセスして先程の画面が表示されれば、カンペキです(`・ω・´)シャキーン

最後に

Spring Web Flowはレガシーな技術ながらも、適用範囲はまだまだ色々あると思います。適材適所で使い分けていければ、きっと最強の武器になるでしょう!!

ご覧いただきありがとうございます! この投稿は役に立ちましたか? 役に立った 役に立たなかった

Be the first to comment

コメント投稿

Your email address will not be published.


*