Java Servlet筛选器-传递不与RequestDispatcher#forward一起使用的属性

Java Servlet筛选器-传递不与RequestDispatcher#forward一起使用的属性,java,servlets,servlet-filters,Java,Servlets,Servlet Filters,我正试图建立一个网站,允许用户创建自己的页面-作为网站的子域,因此我目前正试图做的是有一个过滤器来查看子域,如果它没有被使用,或者是被保留,那么用户将被转发到一个页面,在那里他们选择自己的子域名 我遇到的问题是,当我在ServletRequest对象上设置一个属性,然后使用RequestDispatcher转发时,过滤器会再次被调用——但它看不到我设置的属性 我已经调试并观察了它的工作(或者不工作!),并且正在设置属性,但是在转发之后,属性就不存在了 有人能帮我解释一下发生了什么,以及我该如何解

我正试图建立一个网站,允许用户创建自己的页面-作为网站的子域,因此我目前正试图做的是有一个过滤器来查看子域,如果它没有被使用,或者是被保留,那么用户将被转发到一个页面,在那里他们选择自己的子域名

我遇到的问题是,当我在ServletRequest对象上设置一个属性,然后使用RequestDispatcher转发时,过滤器会再次被调用——但它看不到我设置的属性

我已经调试并观察了它的工作(或者不工作!),并且正在设置属性,但是在转发之后,属性就不存在了

有人能帮我解释一下发生了什么,以及我该如何解决这个问题吗

我可能还应该提到,我正在为JavaGoogleAppEngine开发

这是我的过滤代码

import java.io.IOException;
import java.util.Enumeration;
import java.util.logging.Logger;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;



public class SubdomainFilter implements Filter{
    private static Logger log = Logger.getLogger(SubdomainFilter.class.getName());
    private static final String[] RESERVED_SUBDOMAINS = {"admin", "home", "www"};
    private static final String registerPage = "/register_a_page";

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        //if we've been forwarded, it must have been because of an invalid subdomain
        if(arg0.getAttribute("subdomain") != null) {
            arg2.doFilter(arg0, arg1);
        } else { //otherwise, look at the subdomain and determine what to do
            boolean invalidSubdomain = false;
            try {
                String requestURLInfo = ((HttpServletRequest)arg0).getRequestURL().toString();
                String subdomain = URLUtils.getLowestSubdomainFromURL(requestURLInfo);
                arg0.setAttribute("subdomain", subdomain);
                if(subdomainReserved(subdomain) || subdomainInUse(subdomain)) {
                    invalidSubdomain = true;
                }//Otherwise the subdomain must be valid
            } catch(Exception ex) {
                log.severe("Filter could not get subdomain:\n" + ex.toString());
            } finally {
                if(invalidSubdomain) {
                    RequestDispatcher dispatcher = arg0.getRequestDispatcher(registerPage);
                    dispatcher.forward(arg0, arg1);
                } else {
                    arg2.doFilter(arg0, arg1);
                }
            }
        }

    }

    private boolean subdomainReserved(String subdomain) {
        boolean subdomainReserved = false;
        for(String reservedSubdomain : RESERVED_SUBDOMAINS) {
            if(reservedSubdomain.equals(subdomain)) {
                subdomainReserved = true;
                break;
            }
        }
        return subdomainReserved;
    }

    private boolean subdomainInUse(String subdomain) {
        boolean subdomainInUse = false;
        //TODO: implement
        return subdomainInUse;
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }

}

它应该会起作用。要么是
URLUtils.getLowestSubdomainFromURL()
刚刚返回了
null
,要么是请求-响应链中的其他东西触发了
HttpServletResponse\35; sendRedirect()

它应该可以工作。要么是
URLUtils.getLowestSubdomainFromURL()
刚刚返回了
null
,要么是请求-响应链中的其他东西触发了
HttpServletResponse\35; sendRedirect()

,我想问题在于我没有在我的web.xml中声明以下内容:

<filter-mapping>
   <filter-name>SubdomainFilter</filter-name>
   <servlet-name>*</servlet-name>
   <dispatcher>REQUEST</dispatcher>
   <dispatcher>FORWARD</dispatcher>
</filter-mapping>  

子域过滤器
*
要求
向前地

我认为问题在于我没有在web.xml中声明以下内容:

<filter-mapping>
   <filter-name>SubdomainFilter</filter-name>
   <servlet-name>*</servlet-name>
   <dispatcher>REQUEST</dispatcher>
   <dispatcher>FORWARD</dispatcher>
</filter-mapping>  

子域过滤器
*
要求
向前地

我知道这篇文章已经3年了,但我仍然想确认Louis的帖子,如果你不需要转发属性(即request.getAttribute、request.setAttribute),那么转发就可以不使用下面的web.xml

请求
向前地

我不确定在web.xml中指定dispatcher标记是否会有任何开销,但您确实需要在web.xml中指定dispatcher标记才能使属性正常工作

我知道这篇文章已经发表了3年,但我仍然想确认Louis的帖子,只有在不需要转发属性(即request.getAttribute、request.setAttribute)的情况下,在没有以下web.xml的情况下,该转发才能正常工作

请求
向前地

我不确定在不需要的时候在web.xml中指定dispatcher标记是否会有任何开销,但是在web.xml中确实需要它才能使属性工作

通过调试,getLowestSubdomainFromURL肯定会返回字符串“www”。我不知道这对我为谷歌应用程序引擎开发的应用程序是否有任何影响?通过调试,getLowestSubdomainFromURL肯定会返回字符串“www”。我不知道我为Google App Engine开发的应用程序是否有任何不同?与原始配置的确切区别是什么?与原始配置的确切区别是什么?