001 /* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016 package org.opengion.hayabusa.filter; 017 018 import org.opengion.fukurou.util.Closer; 019 import org.opengion.fukurou.util.HybsDateUtil; 020 021 import javax.servlet.ServletRequest; 022 import javax.servlet.http.HttpServletRequest; 023 import javax.servlet.ServletResponse; 024 import javax.servlet.ServletException; 025 import javax.servlet.ServletContext; 026 import javax.servlet.Filter; 027 import javax.servlet.FilterChain; 028 import javax.servlet.FilterConfig; 029 030 // import java.util.Date; 031 // import java.util.Locale ; 032 // import java.text.DateFormat; 033 // import java.text.SimpleDateFormat; 034 035 import java.io.PrintWriter; 036 import java.io.BufferedReader; 037 import java.io.IOException; 038 import java.io.FileInputStream; 039 import java.io.InputStreamReader; 040 import java.io.UnsupportedEncodingException; 041 042 /** 043 * AccessStopFilter は、Filter インターフェースを継承した アクセス制御クラスです? 044 * web.xml で filter 設定することにより、Webアプリケーションへのアクセスを制御できます? 045 * また?SYSTEM ユーザーは、このフィルターを常に通過します? 046 * 047 * フィルターに対してweb.xml でパラメータを設定します? 048 * ・startTime:停止開始時刻 049 * ・stopTime :停止終?刻 050 * ・filename :停止時メ?ージ表示ファイル? 051 * 052 * 【WEB-INF/web.xml? 053 * <filter> 054 * <filter-name>AccessStopFilter</filter-name> 055 * <filter-class>org.opengion.hayabusa.filter.AccessStopFilter</filter-class> 056 * <init-param> 057 * <param-name>startTime</param-name> 058 * <param-value>070000</param-value> 059 * </init-param> 060 * <init-param> 061 * <param-name>stopTime</param-name> 062 * <param-value>070000</param-value> 063 * </init-param> 064 * <init-param> 065 * <param-name>filename</param-name> 066 * <param-value>jsp/custom/stopFile.html</param-value> 067 * </init-param> 068 * </filter> 069 * 070 * <filter-mapping> 071 * <filter-name>AccessStopFilter</filter-name> 072 * <url-pattern>/jsp/*</url-pattern> 073 * </filter-mapping> 074 * 075 * @og.group フィルター処? 076 * 077 * @version 4.0 078 * @author Kazuhiko Hasegawa 079 * @since JDK5.0, 080 */ 081 public final class AccessStopFilter implements Filter { 082 083 private static boolean stopFilter = false; 084 private String startTime = "230000"; // 停止開始時刻 085 private String stopTime = "070000"; // 停止終?刻 086 private String filename = null; // 停止時メ?ージ表示ファイル? 087 private int startStop = 0; 088 089 /** 090 * フィルター処?体?メソ?です? 091 * 092 * @og.rev 3.1.3.0 (2003/04/10) UTF-8 決め打ちで、stopFile.html を返?する? 093 * @og.rev 3.1.8.0 (2003/05/16) ?エンコードが、UTF-8 になって???を修正? 094 * 095 * @param request ServletRequestオブジェク? 096 * @param response ServletResponseオブジェク? 097 * @param chain FilterChainオブジェク? 098 * @throws ServletException 099 */ 100 public void doFilter( final ServletRequest request, 101 final ServletResponse response, 102 final FilterChain chain) 103 throws IOException, ServletException { 104 105 if( isStop( request ) ) { 106 BufferedReader in = null ; 107 try { 108 response.setContentType( "text/html; charset=UTF-8" ); 109 PrintWriter out = response.getWriter(); 110 in = new BufferedReader( new InputStreamReader( 111 new FileInputStream( filename ) ,"UTF-8" ) ); 112 String str ; 113 while( (str = in.readLine()) != null ) { 114 out.println( str ); 115 } 116 out.flush(); 117 } 118 catch( UnsupportedEncodingException ex ) { 119 String errMsg = "?されたエンコー?ングがサポ?トされて?せん?UTF-8]" ; 120 throw new RuntimeException( errMsg,ex ); 121 } 122 catch( IOException ex ) { 123 String errMsg = "ストリー?オープン出来ませんでした?" + filename + "]" ; 124 throw new RuntimeException( errMsg,ex ); 125 } 126 finally { 127 Closer.ioClose( in ); 128 } 129 return; 130 } 131 132 chain.doFilter(request, response); 133 } 134 135 /** 136 * フィルターの初期処?ソ?です? 137 * 138 * フィルターに対してweb.xml で初期パラメータを設定します? 139 * ・startTime:停止開始時刻 140 * ・stopTime :停止終?刻 141 * ・filename :停止時メ?ージ表示ファイル? 142 * 143 * @param filterConfig FilterConfigオブジェク? 144 */ 145 public void init(final FilterConfig filterConfig) { 146 147 ServletContext context = filterConfig.getServletContext(); 148 String realPath = context.getRealPath( "/" ); 149 150 startTime = filterConfig.getInitParameter("startTime"); 151 stopTime = filterConfig.getInitParameter("stopTime"); 152 filename = realPath + filterConfig.getInitParameter("filename"); 153 154 if( startTime == null || stopTime == null ) { 155 startStop = 0; 156 } 157 else { 158 startStop = startTime.compareTo( stopTime ); 159 } 160 } 161 162 /** 163 * フィルターの終???ソ?です? 164 * 165 */ 166 public void destroy() { 167 // ここでは処?行いません? 168 } 169 170 /** 171 * フィルターの?状態をチェ?するメソ?です? 172 * ?のフラグをもとに、停止/許可を求めます? 173 * 174 * @og.rev 3.1.8.0 (2003/05/16) 開始時刻と終?刻を同?して?と、画面からの制御が効かな?グを修正? 175 * @og.rev 5.5.3.2 (2012/06/08) 通過させるユーザーに、admin を追?ます? 176 * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します? 177 * 178 * @param request ServletRequestオブジェク? 179 * 180 * @return (true:停止 false:実行許可) 181 */ 182 private boolean isStop( final ServletRequest request ) { 183 String userID = ((HttpServletRequest)request).getRemoteUser() ; 184 // 5.5.3.2 (2012/06/08) 通過させるユーザーに、admin を追? 185 // if( "SYSTEM".equalsIgnoreCase( userID ) ) { 186 if( "SYSTEM".equalsIgnoreCase( userID ) || "admin".equalsIgnoreCase( userID ) ) { 187 return false; 188 } 189 190 // 4.0.0 (2005/01/31) 191 // DateFormat formatter = new SimpleDateFormat( "HHmmss",Locale.JAPAN ); 192 // String time = formatter.format( new Date() ); 193 String time = HybsDateUtil.getDate( "HHmmss" ); // 5.5.7.2 (2012/10/09) HybsDateUtil を利用 194 195 boolean rtnFlag = stopFilter; 196 if( startStop < 0 ) { 197 if( startTime.compareTo( time ) < 0 && 198 time.compareTo( stopTime ) < 0 ) { 199 rtnFlag = true; 200 } 201 } 202 else if( startStop > 0 ) { 203 if( startTime.compareTo( time ) < 0 || 204 time.compareTo( stopTime ) < 0 ) { 205 rtnFlag = true; 206 } 207 } 208 return rtnFlag; 209 } 210 211 /** 212 * フィルターの強制停止/解除を設定するメソ?です? 213 * 214 * @og.rev 4.0.0.0 (2005/01/31) synchronized の? 215 * 216 * @param flag (true:停止 false:実行許可) 217 */ 218 public static void setStopFilter( final boolean flag ) { 219 stopFilter = flag; 220 } 221 222 /** 223 * フィルターの?状?強制停止/解除)を取得するメソ?です? 224 * これは、現在、アクセス制限がど?って?かと?状態ではなく? 225 * 強制停止されて?かど?の確認メソ?です? 226 * 227 * @og.rev 4.0.0.0 (2007/11/29) getStopFilter() ?isStopFilter() に変更 228 * 229 * @return (true:停止 false:実行許可) 230 */ 231 // public static boolean getStopFilter() { 232 public static boolean isStopFilter() { 233 return stopFilter; 234 } 235 236 /** 237 * ?状態を??で返します? 238 * 239 * @return こ?クラスの??表示 240 */ 241 @Override 242 public String toString() { 243 StringBuilder sb = new StringBuilder(); 244 sb.append( "AccessStopFilter" ); 245 sb.append( "[" ).append( startTime ).append( "],"); 246 sb.append( "[" ).append( stopTime ).append( "],"); 247 sb.append( "[" ).append( filename ).append( "],"); 248 return (sb.toString()); 249 } 250 }