constraintmanager.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 177 行

JAVA
177
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the *   Free SoftwareFoundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.server.security;import com.caucho.server.dispatch.ErrorFilterChain;import com.caucho.server.dispatch.FilterChainBuilder;import com.caucho.server.dispatch.ForwardFilterChain;import com.caucho.server.dispatch.Invocation;import com.caucho.server.webapp.WebApp;import com.caucho.util.L10N;import javax.servlet.FilterChain;import javax.servlet.RequestDispatcher;import javax.servlet.http.HttpServletResponse;import java.util.ArrayList;import java.util.HashMap;/** * Manages security constraint. */public class ConstraintManager extends FilterChainBuilder {  private static L10N L = new L10N(ConstraintManager.class);  private ArrayList<SecurityConstraint> _constraints    = new ArrayList<SecurityConstraint>();  public void addConstraint(SecurityConstraint constraint)  {    _constraints.add(constraint);  }  public FilterChainBuilder getFilterBuilder()  {    return this;    /*    if (_constraints.size() > 0)      return this;    else      return null;    */  }    /**   * Builds a filter chain dynamically based on the invocation.   *   * @param next the next filter in the chain.   * @param invocation the request's invocation.   */  public FilterChain build(FilterChain next, Invocation invocation)  {    String uri = invocation.getContextURI();    WebApp app = invocation.getWebApp();    if (app == null)      return next;    String lower = uri.toLowerCase();    if (lower.startsWith("/web-inf")	|| lower.startsWith("/meta-inf")) {      return new ErrorFilterChain(HttpServletResponse.SC_NOT_FOUND);    }    ArrayList<AbstractConstraint> constraints;    constraints = new ArrayList<AbstractConstraint>();        HashMap<String,AbstractConstraint[]> methodMap;    methodMap = new HashMap<String,AbstractConstraint[]>();    loop:    for (int i = 0; i < _constraints.size(); i++) {      SecurityConstraint constraint = _constraints.get(i);              if (constraint.isMatch(uri)) {	AbstractConstraint absConstraint = constraint.getConstraint();	if (absConstraint != null) {	  ArrayList<String> methods = constraint.getMethods(uri);	  for (int j = 0; methods != null && j < methods.size(); j++) {	    String method = methods.get(j);	    AbstractConstraint []methodList = methodMap.get(method);	    if (methodList == null)	      methodList = absConstraint.toArray();	    // server/12ba - the first constraint matches, following are	    // ignored	    /*	    else {	      	      AbstractConstraint []newMethods = absConstraint.toArray();			      AbstractConstraint []newList;			      newList = new AbstractConstraint[methodList.length					       + newMethods.length];	      System.arraycopy(methodList, 0, newList, 0, methodList.length);	      System.arraycopy(newMethods, 0, newList,			       methodList.length, newMethods.length);	      methodList = newList;	    }	    */	    methodMap.put(method, methodList);	  }          	  if (methods == null || methods.size() == 0) {	    AbstractConstraint []constArray = absConstraint.toArray();	    for (int k = 0; k < constArray.length; k++)	      constraints.add(constArray[k]);	    // server/12ba - the first constraint matches, following are	    // ignored	    	    break loop;	  }	}	else {	  // server/1233	  	  break loop;	}      }    }    if (uri.endsWith("/j_security_check")	&& app.getLogin() instanceof FormLogin) {      RequestDispatcher disp = app.getNamedDispatcher("j_security_check");      if (disp == null)        throw new IllegalStateException(L.l("j_security_check is an undefined servlet"));      next = new ForwardFilterChain(disp);    }    if (constraints.size() > 0 || methodMap.size() > 0) {      SecurityFilterChain filterChain = new SecurityFilterChain(next);      filterChain.setWebApp(invocation.getWebApp());      if (methodMap.size() > 0)        filterChain.setMethodMap(methodMap);      filterChain.setConstraints(constraints);      return filterChain;    }    return next;  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?