1 17 18 19 package org.apache.catalina.core; 20 21 22 import java.io.IOException ; 23 import java.security.Principal ; 24 import java.security.PrivilegedActionException ; 25 26 import javax.servlet.Filter ; 27 import javax.servlet.FilterChain ; 28 import javax.servlet.Servlet ; 29 import javax.servlet.ServletException ; 30 import javax.servlet.ServletRequest ; 31 import javax.servlet.ServletResponse ; 32 import javax.servlet.http.HttpServletRequest ; 33 import javax.servlet.http.HttpServletResponse ; 34 35 import org.apache.catalina.CometEvent; 36 import org.apache.catalina.CometFilter; 37 import org.apache.catalina.CometFilterChain; 38 import org.apache.catalina.CometProcessor; 39 import org.apache.catalina.Globals; 40 import org.apache.catalina.InstanceEvent; 41 import org.apache.catalina.security.SecurityUtil; 42 import org.apache.catalina.util.InstanceSupport; 43 import org.apache.catalina.util.StringManager; 44 45 55 56 final class ApplicationFilterChain implements FilterChain , CometFilterChain { 57 58 private final static ThreadLocal lastServicedRequest; 60 private final static ThreadLocal lastServicedResponse; 61 62 static { 63 if (Globals.STRICT_SERVLET_COMPLIANCE) { 64 lastServicedRequest = new ThreadLocal (); 65 lastServicedResponse = new ThreadLocal (); 66 } else { 67 lastServicedRequest = null; 68 lastServicedResponse = null; 69 } 70 } 71 72 74 75 public static final int INCREMENT = 10; 76 77 78 80 81 84 public ApplicationFilterChain() { 85 86 super(); 87 88 } 89 90 91 93 94 97 private ApplicationFilterConfig[] filters = 98 new ApplicationFilterConfig[0]; 99 100 101 105 private int pos = 0; 106 107 108 111 private int n = 0; 112 113 114 117 private Servlet servlet = null; 118 119 120 123 private static final StringManager sm = 124 StringManager.getManager(Constants.Package); 125 126 127 131 private InstanceSupport support = null; 132 133 134 138 private static Class [] classType = new Class []{ServletRequest .class, 139 ServletResponse .class, 140 FilterChain .class}; 141 142 146 private static Class [] classTypeUsedInService = new Class []{ 147 ServletRequest .class, 148 ServletResponse .class}; 149 150 154 private static Class [] cometClassType = 155 new Class []{ CometEvent.class, CometFilterChain.class}; 156 157 161 private static Class [] classTypeUsedInEvent = 162 new Class [] { CometEvent.class }; 163 164 166 167 178 public void doFilter(ServletRequest request, ServletResponse response) 179 throws IOException , ServletException { 180 181 if( System.getSecurityManager() != null ) { 182 final ServletRequest req = request; 183 final ServletResponse res = response; 184 try { 185 java.security.AccessController.doPrivileged( 186 new java.security.PrivilegedExceptionAction () { 187 public Object run() 188 throws ServletException , IOException { 189 internalDoFilter(req,res); 190 return null; 191 } 192 } 193 ); 194 } catch( PrivilegedActionException pe) { 195 Exception e = pe.getException(); 196 if (e instanceof ServletException ) 197 throw (ServletException ) e; 198 else if (e instanceof IOException ) 199 throw (IOException ) e; 200 else if (e instanceof RuntimeException ) 201 throw (RuntimeException ) e; 202 else 203 throw new ServletException (e.getMessage(), e); 204 } 205 } else { 206 internalDoFilter(request,response); 207 } 208 } 209 210 private void internalDoFilter(ServletRequest request, 211 ServletResponse response) 212 throws IOException , ServletException { 213 214 if (pos < n) { 216 ApplicationFilterConfig filterConfig = filters[pos++]; 217 Filter filter = null; 218 try { 219 filter = filterConfig.getFilter(); 220 support.fireInstanceEvent(InstanceEvent.BEFORE_FILTER_EVENT, 221 filter, request, response); 222 223 if( System.getSecurityManager() != null ) { 224 final ServletRequest req = request; 225 final ServletResponse res = response; 226 Principal principal = 227 ((HttpServletRequest ) req).getUserPrincipal(); 228 229 Object [] args = new Object []{req, res, this}; 230 SecurityUtil.doAsPrivilege 231 ("doFilter", filter, classType, args); 232 233 args = null; 234 } else { 235 filter.doFilter(request, response, this); 236 } 237 238 support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT, 239 filter, request, response); 240 } catch (IOException e) { 241 if (filter != null) 242 support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT, 243 filter, request, response, e); 244 throw e; 245 } catch (ServletException e) { 246 if (filter != null) 247 support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT, 248 filter, request, response, e); 249 throw e; 250 } catch (RuntimeException e) { 251 if (filter != null) 252 support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT, 253 filter, request, response, e); 254 throw e; 255 } catch (Throwable e) { 256 if (filter != null) 257 support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT, 258 filter, request, response, e); 259 throw new ServletException 260 (sm.getString("filterChain.filter"), e); 261 } 262 return; 263 } 264 265 try { 267 if (Globals.STRICT_SERVLET_COMPLIANCE) { 268 lastServicedRequest.set(request); 269 lastServicedResponse.set(response); 270 } 271 272 support.fireInstanceEvent(InstanceEvent.BEFORE_SERVICE_EVENT, 273 servlet, request, response); 274 if ((request instanceof HttpServletRequest ) && 275 (response instanceof HttpServletResponse )) { 276 277 if( System.getSecurityManager() != null ) { 278 final ServletRequest req = request; 279 final ServletResponse res = response; 280 Principal principal = 281 ((HttpServletRequest ) req).getUserPrincipal(); 282 Object [] args = new Object []{req, res}; 283 SecurityUtil.doAsPrivilege("service", 284 servlet, 285 classTypeUsedInService, 286 args, 287 principal); 288 args = null; 289 } else { 290 servlet.service((HttpServletRequest ) request, 291 (HttpServletResponse ) response); 292 } 293 } else { 294 servlet.service(request, response); 295 } 296 support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT, 297 servlet, request, response); 298 } catch (IOException e) { 299 support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT, 300 servlet, request, response, e); 301 throw e; 302 } catch (ServletException e) { 303 support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT, 304 servlet, request, response, e); 305 throw e; 306 } catch (RuntimeException e) { 307 support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT, 308 servlet, request, response, e); 309 throw e; 310 } catch (Throwable e) { 311 support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT, 312 servlet, request, response, e); 313 throw new ServletException 314 (sm.getString("filterChain.servlet"), e); 315 } finally { 316 if (Globals.STRICT_SERVLET_COMPLIANCE) { 317 lastServicedRequest.set(null); 318 lastServicedResponse.set(null); 319 } 320 } 321 322 } 323 324 325 336 public void doFilterEvent(CometEvent event) 337 throws IOException , ServletException { 338 339 if( System.getSecurityManager() != null ) { 340 final CometEvent ev = event; 341 try { 342 java.security.AccessController.doPrivileged( 343 new java.security.PrivilegedExceptionAction () { 344 public Object run() 345 throws ServletException , IOException { 346 internalDoFilterEvent(ev); 347 return null; 348 } 349 } 350 ); 351 } catch( PrivilegedActionException pe) { 352 Exception e = pe.getException(); 353 if (e instanceof ServletException ) 354 throw (ServletException ) e; 355 else if (e instanceof IOException ) 356 throw (IOException ) e; 357 else if (e instanceof RuntimeException ) 358 throw (RuntimeException ) e; 359 else 360 throw new ServletException (e.getMessage(), e); 361 } 362 } else { 363 internalDoFilterEvent(event); 364 } 365 } 366 367 368 374 public static ServletRequest getLastServicedRequest() { 375 return (ServletRequest ) lastServicedRequest.get(); 376 } 377 378 379 385 public static ServletResponse getLastServicedResponse() { 386 return (ServletResponse ) lastServicedResponse.get(); 387 } 388 389 390 private void internalDoFilterEvent(CometEvent event) 391 throws IOException , ServletException { 392 393 if (pos < n) { 395 ApplicationFilterConfig filterConfig = filters[pos++]; 396 CometFilter filter = null; 397 try { 398 filter = (CometFilter) filterConfig.getFilter(); 399 404 405 if( System.getSecurityManager() != null ) { 406 final CometEvent ev = event; 407 Principal principal = 408 ev.getHttpServletRequest().getUserPrincipal(); 409 410 Object [] args = new Object []{ev, this}; 411 SecurityUtil.doAsPrivilege 412 ("doFilterEvent", (Filter ) filter, cometClassType, args); 413 414 args = null; 415 } else { 416 filter.doFilterEvent(event, this); 417 } 418 419 421 } catch (IOException e) { 422 427 throw e; 428 } catch (ServletException e) { 429 434 throw e; 435 } catch (RuntimeException e) { 436 441 throw e; 442 } catch (Throwable e) { 443 446 throw new ServletException 447 (sm.getString("filterChain.filter"), e); 448 } 449 return; 450 } 451 452 try { 454 458 if( System.getSecurityManager() != null ) { 459 final CometEvent ev = event; 460 Principal principal = 461 ev.getHttpServletRequest().getUserPrincipal(); 462 Object [] args = new Object []{ ev }; 463 SecurityUtil.doAsPrivilege("event", 464 servlet, 465 classTypeUsedInEvent, 466 args, 467 principal); 468 args = null; 469 } else { 470 ((CometProcessor) servlet).event(event); 471 } 472 475 } catch (IOException e) { 476 480 throw e; 481 } catch (ServletException e) { 482 486 throw e; 487 } catch (RuntimeException e) { 488 492 throw e; 493 } catch (Throwable e) { 494 498 throw new ServletException 499 (sm.getString("filterChain.servlet"), e); 500 } 501 502 } 503 504 505 507 508 509 514 void addFilter(ApplicationFilterConfig filterConfig) { 515 516 if (n == filters.length) { 517 ApplicationFilterConfig[] newFilters = 518 new ApplicationFilterConfig[n + INCREMENT]; 519 System.arraycopy(filters, 0, newFilters, 0, n); 520 filters = newFilters; 521 } 522 filters[n++] = filterConfig; 523 524 } 525 526 527 530 void release() { 531 532 n = 0; 533 pos = 0; 534 servlet = null; 535 support = null; 536 537 } 538 539 540 543 void reuse() { 544 pos = 0; 545 } 546 547 548 553 void setServlet(Servlet servlet) { 554 555 this.servlet = servlet; 556 557 } 558 559 560 566 void setSupport(InstanceSupport support) { 567 568 this.support = support; 569 570 } 571 572 573 } 574 | Popular Tags |