2010-07-02 3 views
1

Я пытаюсь создать сайт, который позволяет пользователям создавать свою собственную страницу - как субдомен сайта, и поэтому то, что я сейчас пытаюсь сделать должен иметь фильтр, который смотрит на субдомен, и если он не используется или если он зарезервирован, то пользователь будет перенаправлен на страницу, где они выбирают свое имя поддомена.Сервлет-фильтры - передача атрибута, не работающего с RequestDispatcher # forward

Проблема в том, что когда я устанавливаю атрибут объекта ServletRequest, а затем пересылаю его с помощью RequestDispatcher, фильтр снова вызывается, но он не может видеть атрибут, который я установил.

Я отлаживал и смотрел, как он работает (или не работает!), И атрибут устанавливается, но после переадресации атрибута нет.

Может кто-нибудь помочь объяснить, что происходит, и как я могу это исправить?

Возможно, я должен также упомянуть, что я разрабатываю Java-движок Java.

Вот мой код фильтра.

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 
    } 

} 

ответ

1

Я думаю, что проблема в том, что я не объявляю следующее в моем web.xml:

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

Какая разница с исходной конфигурацией? – BalusC

0

Должно работать. Либо URLUtils.getLowestSubdomainFromURL() только что вернул null, либо что-то еще в цепочке запроса-ответа запустило HttpServletResponse#sendRedirect().

+0

С помощью отладки getLowestSubdomainFromURL определенно возвращает строку «www». Я не знаю, имеет ли значение, что я разрабатываю для Google App Engine? –

0

Я знаю, что этот пост 3-х лет, но я все еще хочу, чтобы подтвердить пост Луи, что переадресация отлично работает без следующего web.xml ТОЛЬКО ЕСЛИ вам не нужны перенаправленные атрибуты (т. е. request.getAttribute, request.setAttribute).

<dispatcher>REQUEST</dispatcher> 
<dispatcher>FORWARD</dispatcher> 

Я не уверен, если есть какие-либо накладные расходы, указав диспетчерские тегов в web.xml, когда не нужно, но вы определенно нужны, что в web.xml для атрибутов работа.