📄 servlethandler.java
字号:
{ FilterHolder[] holders = getFilters(); if (holders!=null) holders = (FilterHolder[])holders.clone(); try { setFilters((FilterHolder[])LazyList.addToArray(holders, holder, FilterHolder.class)); FilterMapping mapping = new FilterMapping(); mapping.setFilterName(holder.getName()); mapping.setPathSpec(pathSpec); mapping.setDispatches(dispatches); setFilterMappings((FilterMapping[])LazyList.addToArray(getFilterMappings(), mapping, FilterMapping.class)); } catch (RuntimeException e) { setFilters(holders); throw e; } catch (Error e) { setFilters(holders); throw e; } } /* ------------------------------------------------------------ */ /** Convenience method to add a filter with a mapping * @param className * @param pathSpec * @param dispatches * @return * @deprecated */ public FilterHolder addFilter (String className,String pathSpec,int dispatches) { return addFilterWithMapping(className, pathSpec, dispatches); } /* ------------------------------------------------------------ */ /** * convenience method to add a filter and mapping * @param filter * @param filterMapping */ public void addFilter (FilterHolder filter, FilterMapping filterMapping) { if (filter != null) setFilters((FilterHolder[])LazyList.addToArray(getFilters(), filter, FilterHolder.class)); if (filterMapping != null) setFilterMappings((FilterMapping[])LazyList.addToArray(getFilterMappings(), filterMapping, FilterMapping.class)); } /* ------------------------------------------------------------ */ /** Convenience method to add a preconstructed FilterHolder * @param filter */ public void addFilter (FilterHolder filter) { if (filter != null) setFilters((FilterHolder[])LazyList.addToArray(getFilters(), filter, FilterHolder.class)); } /* ------------------------------------------------------------ */ /** Convenience method to add a preconstructed FilterMapping * @param mapping */ public void addFilterMapping (FilterMapping mapping) { if (mapping != null) setFilterMappings((FilterMapping[])LazyList.addToArray(getFilterMappings(), mapping, FilterMapping.class)); } /* ------------------------------------------------------------ */ protected synchronized void updateNameMappings() { // update filter name map _filterNameMap.clear(); if (_filters!=null) { for (int i=0;i<_filters.length;i++) { _filterNameMap.put(_filters[i].getName(),_filters[i]); _filters[i].setServletHandler(this); } } // Map servlet names to holders _servletNameMap.clear(); if (_servlets!=null) { // update the maps for (int i=0;i<_servlets.length;i++) { _servletNameMap.put(_servlets[i].getName(),_servlets[i]); _servlets[i].setServletHandler(this); } } } /* ------------------------------------------------------------ */ protected synchronized void updateMappings() { // update filter mappings if (_filterMappings==null) { _filterPathMappings=null; _filterNameMappings=null; } else { _filterPathMappings=new ArrayList(); _filterNameMappings=new MultiMap(); for (int i=0;i<_filterMappings.length;i++) { FilterHolder filter_holder = (FilterHolder)_filterNameMap.get(_filterMappings[i].getFilterName()); if (filter_holder==null) throw new IllegalStateException("No filter named "+_filterMappings[i].getFilterName()); _filterMappings[i].setFilterHolder(filter_holder); if (_filterMappings[i].getPathSpecs()!=null) _filterPathMappings.add(_filterMappings[i]); if (_filterMappings[i].getServletNames()!=null) { String[] names=_filterMappings[i].getServletNames(); for (int j=0;j<names.length;j++) { if (names[j]!=null) _filterNameMappings.add(names[j], _filterMappings[i]); } } } } // Map servlet paths to holders if (_servletMappings==null || _servletNameMap==null) { _servletPathMap=null; } else { PathMap pm = new PathMap(); // update the maps for (int i=0;i<_servletMappings.length;i++) { ServletHolder servlet_holder = (ServletHolder)_servletNameMap.get(_servletMappings[i].getServletName()); if (servlet_holder==null) throw new IllegalStateException("No such servlet: "+_servletMappings[i].getServletName()); else if (_servletMappings[i].getPathSpecs()!=null) { String[] pathSpecs = _servletMappings[i].getPathSpecs(); for (int j=0;j<pathSpecs.length;j++) if (pathSpecs[j]!=null) pm.put(pathSpecs[j],servlet_holder); } } _servletPathMap=pm; } if (Log.isDebugEnabled()) { Log.debug("filterNameMap="+_filterNameMap); Log.debug("pathFilters="+_filterPathMappings); Log.debug("servletFilterMap="+_filterNameMappings); Log.debug("servletPathMap="+_servletPathMap); Log.debug("servletNameMap="+_servletNameMap); } try { if (isStarted()) initialize(); } catch (Exception e) { throw new RuntimeException(e); } } /* ------------------------------------------------------------ */ protected void notFound(HttpServletRequest request, HttpServletResponse response) throws IOException { if(Log.isDebugEnabled())Log.debug("Not Found "+request.getRequestURI()); response.sendError(HttpServletResponse.SC_NOT_FOUND); } /* ------------------------------------------------------------ */ /** * @param filterChainsCached The filterChainsCached to set. */ public void setFilterChainsCached(boolean filterChainsCached) { _filterChainsCached = filterChainsCached; } /* ------------------------------------------------------------ */ /** * @param filterMappings The filterMappings to set. */ public void setFilterMappings(FilterMapping[] filterMappings) { if (getServer()!=null) getServer().getContainer().update(this,_filterMappings,filterMappings,"filterMapping",true); _filterMappings = filterMappings; updateMappings(); } /* ------------------------------------------------------------ */ public synchronized void setFilters(FilterHolder[] holders) { if (getServer()!=null) getServer().getContainer().update(this,_filters,holders,"filter",true); _filters=holders; updateNameMappings(); } /* ------------------------------------------------------------ */ /** * @param servletMappings The servletMappings to set. */ public void setServletMappings(ServletMapping[] servletMappings) { if (getServer()!=null) getServer().getContainer().update(this,_servletMappings,servletMappings,"servletMapping",true); _servletMappings = servletMappings; updateMappings(); } /* ------------------------------------------------------------ */ /** Set Servlets. * @param holders Array of servletsto define */ public synchronized void setServlets(ServletHolder[] holders) { if (getServer()!=null) getServer().getContainer().update(this,_servlets,holders,"servlet",true); _servlets=holders; updateNameMappings(); } /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ private class CachedChain implements FilterChain { FilterHolder _filterHolder; CachedChain _next; ServletHolder _servletHolder; /* ------------------------------------------------------------ */ CachedChain(Object filters, ServletHolder servletHolder) { if (LazyList.size(filters)>0) { _filterHolder=(FilterHolder)LazyList.get(filters, 0); filters=LazyList.remove(filters,0); _next=new CachedChain(filters,servletHolder); } else _servletHolder=servletHolder; } /* ------------------------------------------------------------ */ public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { // pass to next filter if (_filterHolder!=null) { if (Log.isDebugEnabled()) Log.debug("call filter " + _filterHolder); Filter filter= _filterHolder.getFilter(); filter.doFilter(request, response, _next); return; } // Call servlet if (_servletHolder != null) { if (Log.isDebugEnabled()) Log.debug("call servlet " + _servletHolder); _servletHolder.handle(request, response); } else // Not found notFound((HttpServletRequest)request, (HttpServletResponse)response); } public String toString() { if (_filterHolder!=null) return _filterHolder+"->"+_next.toString(); if (_servletHolder!=null) return _servletHolder.toString(); return "null"; } } /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ private class Chain implements FilterChain { int _filter= 0; Object _chain; ServletHolder _servletHolder; /* ------------------------------------------------------------ */ Chain(Object filters, ServletHolder servletHolder) { _chain= filters; _servletHolder= servletHolder; } /* ------------------------------------------------------------ */ public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { if (Log.isDebugEnabled()) Log.debug("doFilter " + _filter); // pass to next filter if (_filter < LazyList.size(_chain)) { FilterHolder holder= (FilterHolder)LazyList.get(_chain, _filter++); if (Log.isDebugEnabled()) Log.debug("call filter " + holder); Filter filter= holder.getFilter(); filter.doFilter(request, response, this); return; } // Call servlet if (_servletHolder != null) { if (Log.isDebugEnabled()) Log.debug("call servlet " + _servletHolder); _servletHolder.handle(request, response); } else // Not found notFound((HttpServletRequest)request, (HttpServletResponse)response); } /* ------------------------------------------------------------ */ public String toString() { StringBuffer b = new StringBuffer(); for (int i=0; i<LazyList.size(_chain);i++) { b.append(LazyList.get(_chain, i).toString()); b.append("->"); } b.append(_servletHolder); return b.toString(); } } /* ------------------------------------------------------------ */ /** * @return The maximum entries in a filter chain cache. */ public int getMaxFilterChainsCacheSize() { return _maxFilterChainsCacheSize; } /* ------------------------------------------------------------ */ /** Set the maximum filter chain cache size. * Filter chains are cached if {@link #isFilterChainsCached()} is true. If the max cache size * is greater than zero, then the cache is flushed whenever it grows to be this size. * * @param maxFilterChainsCacheSize the maximum number of entries in a filter chain cache. */ public void setMaxFilterChainsCacheSize(int maxFilterChainsCacheSize) { _maxFilterChainsCacheSize = maxFilterChainsCacheSize; } /** * Customize a servlet. * * Called before the servlet goes into service. * Subclasses of ServletHandler should override * this method. * * @param servlet * @return * @throws Exception */ public Servlet customizeServlet (Servlet servlet) throws Exception { return servlet; } public Servlet customizeServletDestroy (Servlet servlet) throws Exception { return servlet; } /** * Customize a Filter. * * Called before the Filter goes into service. * Subclasses of ServletHandler should override * this method. * * @param filter * @return * @throws Exception */ public Filter customizeFilter (Filter filter) throws Exception { return filter; } public Filter customizeFilterDestroy (Filter filter) throws Exception { return filter; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -