サービス時間の制御

今まで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のみでサービス時間を管理する場合はいいけど、バックエンドでサービス時間を管理するような場合、そのサービスへのリモート参照をインジェクションできたらうれしいかも、って無理か。ま、必要になったらもちょっと深く考えましょ。