Home   Single Page

リクエストインターセプター

アプリケーションの性質により、ユーザーがログインしてから、ロケールを決めるのが遅すぎる場合があります。
例えば、ユーザーがログインする前に、 前セッションで使用した同じロケールを使用させる場合があります。
そのとき、ウェブアプリケーションでは、クッキーを使って行われます。ZKの場合は、リ クエストインターセプターを登録し、インターセプターが呼ばれるときにクッキーを処理します。

リクエストインターセプターはZKローダーとZKアップデートエンジンによって処理されたリクエストをインターセプト(介入) します。
それを使用するため、org.zkoss.zk.ui.util.RequestInterceptorインターフェースを実装しなければなりません。例えば、

public class MyLocaleProvider implements org.zkoss.zk.ui.util.RequestInterceptor {
    public void request(org.zkoss.zk.ui.Session sess,    
    Object request, Object response) {    
        final Cookie[] cookies = ((HttpServletRequest)request).getCookies();        
        if (cookies != null) {        
            for (int j = cookies.length; --j >= 0;) {            
                if (cookies[j].getName().equals("my.locale")) {                
                    //determine the locale                    
                    String val = cookies[j].getValue();                    
                    Locale locale = org.zkoss.util.Locales.getLocale(val);                    
                    sess.setAttribute(Attributes.PREFERRED_LOCALE, locale);                    
                    return;                    
                }                
            }            
        }        
    }    
}

有効にするために、以下のようにWEB-INF/zk.xmlの中にそれを登録しなければなりません。
一度登録されると、ZKローダーまたはZKアップデートエンジンがリクエストを受け取るたびに、リクエストメソッドを呼び出します。
設定について開発用リファレンス中のAppendix Bを参照してください。

<listener>
    <listener-class>MyLocaleProvider</listener-class>    
</listener>

【メモ】:インターセプターのインスタンスは登録されるときにインスタンス化されます。
同一アプリケーション中のすべてのリクエストで共有されます。このため、同時に通信できる(つまり、thread-safe)ことを事前に確認しなければなりません。

【メモ】:request メソッドはかなり早い段階、リクエストパラメータが渡される前に、呼び出されます。
このため、リクエストにロケールと文字列を適切にエンコードしない限り、このメソッドでそれらに通信することを推奨します。