001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.geronimo.console.servlet;
019
020 import java.io.IOException;
021
022 import javax.servlet.Filter;
023 import javax.servlet.FilterChain;
024 import javax.servlet.FilterConfig;
025 import javax.servlet.ServletException;
026 import javax.servlet.ServletRequest;
027 import javax.servlet.ServletResponse;
028 import javax.servlet.http.HttpServletRequest;
029 import javax.servlet.http.HttpServletRequestWrapper;
030
031 /**
032 * Filter that wrappers HTTP requests forwarded from a separate
033 * context via a named request dispatcher. The wrapped HTTP
034 * requests return attributes from the original request instead
035 * of the forwarded instance of the request. Deployment
036 * descriptors that use this filter should specify "FORWARD" as
037 * the dispatcher type in their filter-mapping elements, as per
038 * the 2.4 Servlet Specification. e.g.
039 *
040 * <pre>
041 * <filter-mapping>
042 * <filter-name>myfilter</filter-name>
043 * <servlet-name>myservlet</servlet-name>
044 * <dispatcher>FORWARD</dispatcher>
045 * </filter-mapping>
046 * </pre>
047 *
048 */
049 public class ForwardDispatchFilter implements Filter {
050
051 protected FilterConfig filterConfig;
052
053 public void init(FilterConfig config) throws ServletException {
054 filterConfig = config;
055 }
056
057 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
058 if (request instanceof HttpServletRequest) {
059 chain.doFilter(new ForwardRequest((HttpServletRequest)request), response);
060 } else {
061 throw new ServletException("ServletRequest is not an instance of HttpServletRequest");
062 }
063 }
064
065 public void destroy() {}
066
067 /* An HTTP servlet request wrapper that maps the following
068 * attributes from the original request
069 *
070 * # javax.servlet.forward.request_uri
071 * # javax.servlet.forward.context_path
072 * # javax.servlet.forward.servlet_path
073 * # javax.servlet.forward.path_info
074 * # javax.servlet.forward.query_string
075 */
076 protected class ForwardRequest extends HttpServletRequestWrapper {
077 HttpServletRequest request;
078 public ForwardRequest(HttpServletRequest req) {
079 super(req);
080 request = req;
081 }
082 public String getRequestURI() {
083 return String.valueOf(request.getAttribute("javax.servlet.forward.request_uri"));
084 }
085 public String getContextPath() {
086 return String.valueOf(request.getAttribute("javax.servlet.forward.context_path"));
087 }
088 public String getServletPath() {
089 return String.valueOf(request.getAttribute("javax.servlet.forward.servlet_path"));
090 }
091 public String getPathInfo() {
092 return String.valueOf(request.getAttribute("javax.servlet.forward.path_info"));
093 }
094 public String getQueryString() {
095 return String.valueOf(request.getAttribute("javax.servlet.forward.query_string"));
096 }
097 }
098 }