001: /* Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
002: *
003: * Licensed under the Apache License, Version 2.0 (the "License");
004: * you may not use this file except in compliance with the License.
005: * You may obtain a copy of the License at
006: *
007: * http://www.apache.org/licenses/LICENSE-2.0
008: *
009: * Unless required by applicable law or agreed to in writing, software
010: * distributed under the License is distributed on an "AS IS" BASIS,
011: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012: * See the License for the specific language governing permissions and
013: * limitations under the License.
014: */
015:
016: package org.acegisecurity.wrapper;
017:
018: import org.acegisecurity.util.PortResolver;
019: import org.acegisecurity.util.PortResolverImpl;
020:
021: import org.springframework.util.Assert;
022: import org.springframework.util.ReflectionUtils;
023:
024: import java.io.IOException;
025:
026: import java.lang.reflect.Constructor;
027:
028: import javax.servlet.Filter;
029: import javax.servlet.FilterChain;
030: import javax.servlet.FilterConfig;
031: import javax.servlet.ServletException;
032: import javax.servlet.ServletRequest;
033: import javax.servlet.ServletResponse;
034: import javax.servlet.http.HttpServletRequest;
035:
036: /**
037: * A <code>Filter</code> which populates the <code>ServletRequest</code> with a new request wrapper.<p>Several
038: * request wrappers are included with the framework. The simplest version is {@link
039: * SecurityContextHolderAwareRequestWrapper}. A more complex and powerful request wrapper is {@link
040: * org.acegisecurity.wrapper.SavedRequestAwareWrapper}. The latter is also the default.</p>
041: * <p>To modify the wrapper used, call {@link #setWrapperClass(Class)}.</p>
042: * <p>Any request wrapper configured for instantiation by this class must provide a public constructor that
043: * accepts two arguments, being a <code>HttpServletRequest</code> and a <code>PortResolver</code>.</p>
044: *
045: * @author Orlando Garcia Carmona
046: * @author Ben Alex
047: * @version $Id: SecurityContextHolderAwareRequestFilter.java 1496 2006-05-23 13:38:33Z benalex $
048: */
049: public class SecurityContextHolderAwareRequestFilter implements Filter {
050: //~ Instance fields ================================================================================================
051:
052: private Class wrapperClass = SavedRequestAwareWrapper.class;
053: private Constructor constructor;
054: private PortResolver portResolver = new PortResolverImpl();
055:
056: //~ Methods ========================================================================================================
057:
058: public void destroy() {
059: }
060:
061: public void doFilter(ServletRequest servletRequest,
062: ServletResponse servletResponse, FilterChain filterChain)
063: throws IOException, ServletException {
064: HttpServletRequest request = (HttpServletRequest) servletRequest;
065:
066: if (!wrapperClass.isAssignableFrom(request.getClass())) {
067: if (constructor == null) {
068: try {
069: constructor = wrapperClass
070: .getConstructor(new Class[] {
071: HttpServletRequest.class,
072: PortResolver.class });
073: } catch (Exception ex) {
074: ReflectionUtils.handleReflectionException(ex);
075: }
076: }
077:
078: try {
079: request = (HttpServletRequest) constructor
080: .newInstance(new Object[] { request,
081: portResolver });
082: } catch (Exception ex) {
083: ReflectionUtils.handleReflectionException(ex);
084: }
085: }
086:
087: filterChain.doFilter(request, servletResponse);
088: }
089:
090: public void init(FilterConfig filterConfig) throws ServletException {
091: }
092:
093: public void setPortResolver(PortResolver portResolver) {
094: Assert.notNull(portResolver, "PortResolver required");
095: this .portResolver = portResolver;
096: }
097:
098: public void setWrapperClass(Class wrapperClass) {
099: Assert.notNull(wrapperClass, "WrapperClass required");
100: Assert.isTrue(HttpServletRequest.class
101: .isAssignableFrom(wrapperClass),
102: "Wrapper must be a HttpServletRequest");
103: this.wrapperClass = wrapperClass;
104: }
105: }
|