EZweb端末の強制的なブラウザキャッシュに適切に対処する
EZweb1端末では、Expires, Cache-ControlといったHTTPレスポンスヘッダによってブラウザのキャッシュを無効にしたとしても、現在のブラウザセッション中に端末の「戻る」「進む」ボタンを押すことで、ブラウザのキャッシュが表示されてしまいます。下記はマニュアル2からの引用です。
3. 有効期限切れのPageであってもBack動作ではCacheを表示。
ディスパッチャ?にDispatcher_Continuationプラグインを使っているアプリケーションは、この挙動から大きな影響を受けます。下記のフローで検証してみましょう。
- フロー実行を開始し、ステートDisplayPageAの画面から、ステートDisplayPageBの画面へ進む。
- ステートDisplayPageBの画面が表示される。
- 端末の「戻る」ボタンを押し、ステートDisplayPageAの画面から、ステートDisplayPageCの画面へ進む。
- ステートDisplayPageBの画面が表示される。
ステートDisplayPageAの画面から、ステートDisplayPageCの画面へ進もうとすると、イベントFromDisplayPageAToDisplayPageCが発生します。(上記の3)
しかし、現在のステートDisplayPageBには、FromDisplayPageAToDisplayPageCというイベントは定義されていないため、現在のステートであるDisplayPageBが更新され、結果的にDisplayPageBの画面が表示されることになります。(上記の4)
開発者は、このような挙動に対して下記の対策を実行することができます。
- WMLまたはHDMLを使って「戻る」ボタンの動作を変更する。
- WMLまたはHDMLを直接記述することで、「戻る」ボタンの動作を変更することができます。この対策の詳細については後述します。
- 適宜イベントを定義する。
- 実際にイベントを定義し、正しい遷移として処理されるようにします。上記の例でいうと、ステートDisplayPageBに対して、イベントFromDisplayPageAToDisplayPageCを受け取ると、ステートDisplayPageBへ進む遷移を追加します。
- Dispatcher_Simpleプラグインを使う。
- フローのすべてのビューステートからのイベントをすべてのビューステートが受け取れるようにしたい場合は、Dispatcher_Continuationプラグインを使うのは止め、Dispatcher_Simpleプラグイン?を使うようにしてください。
WMLまたはHDMLの記述による「戻る」ボタンの動作の変更
WML3は、WAP4端末向けのコンテンツ記述言語です。日本国内では、auのEZwebに採用されています。WMLのバージョン1はXMLベースの独自の記述言語でしたが、バージョン2でXHTML互換の言語となりました。また、HDMLはEZwebで利用可能なコンテンツ記述言語のひとつです。ここでは、WML 2による「戻る」ボタンの動作の変更について解説します。
「戻る」ボタンの無効化
<?xml version="1.0" encoding="Shift_JIS" ?> <!DOCTYPE html PUBLIC"-//WAPFORUM//DTD WML 2.0//EN" "http://www.wapforum.org/dtd/wml20.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wml="http://www.wapforum.org/2001/wml"> ... <body> ... <wml:do type="prev"> <noop /> </wml:do> ... </body> </html>
「戻る」ボタンへの任意のリクエストの割り当て
<?xml version="1.0" encoding="Shift_JIS" ?> <!DOCTYPE html PUBLIC"-//WAPFORUM//DTD WML 2.0//EN" "http://www.wapforum.org/dtd/wml20.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wml="http://www.wapforum.org/2001/wml"> ... <body> ... <wml:do type="prev"> <go href="{__scriptName}?{__sessionName}={__sessionID}&{__flowExecutionTicketKey}={__flowExecutionTicket}" /> </wml:do> ... </body> </html>
上記の場合、リクエストにイベント名が含まれていないため、「戻る」ボタンが押されても単に現在の画面が返されます。これは、PCやDoCoMoと全く同じ動作となります。
参考
ユーザコメント


