サービス時間の制御
今までSwingとサーバーサイドの仕事ばかりしていたので、最近手を出し始めたWebアプリが結構新鮮で面白く感じる今日この頃。
今日は、サービス時間の制御にFilterを使ってみました。JSFのリダイレクト方法を調べたり、各JSP内で条件付のリダイレクトを実装したらどうかとか、いろいろ考えてみたのですが、一番ラクチンそうだという理由でFilterを採用しました。もっといい方法をご存知の方、こっそり教えてください。
フィルタはこんな感じ。
public class ServiceTimeFilter implements Filter { /* (non-Javadoc) * @see javax.servlet.Filter#destroy() */ public void destroy() {} /* (non-Javadoc) * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) */ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { if (!isOutOfService()) { // 時間内の場合 chain.doFilter(req, res); } else { // 時間外の場合 HttpServletResponse response = (HttpServletResponse)res; response.sendRedirect("http://host/app/out_of_service.jsp"); } } /* (non-Javadoc) * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) */ public void init(FilterConfig arg0) throws ServletException {} private boolean isOutOfService() { // 時間外チェックロジック } }
web.xmlはこんな感じ。
<!-- フィルタ設定(ServiceTimeFilter) --> <filter> <filter-name>serviceTimeFilter</filter-name> <filter-class>com.hoge.filters.ServiceTimeFilter</filter-class> </filter> <!-- すべての.jsfファイルはserviceTimeFilterを経由するように設定 --> <filter-mapping> <filter-name>serviceTimeFilter</filter-name> <url-pattern>*.jsf</url-pattern> </filter-mapping>
フィルタクラスの実装を直接指定しなければならない部分は、少し使いづらいかも。WebアプリのUIのみでサービス時間を管理する場合はいいけど、バックエンドでサービス時間を管理するような場合、そのサービスへのリモート参照をインジェクションできたらうれしいかも、って無理か。ま、必要になったらもちょっと深く考えましょ。