Фильтры сервлетов - передача атрибута, не работающего с RequestDispatcher # forward - PullRequest
1 голос
/ 02 июля 2010

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

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

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

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

Я должен также упомянуть, что я разрабатываю для Java Google App Engine.

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

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
    }

}

Ответы [ 3 ]

1 голос
/ 02 августа 2010

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

<filter-mapping>
   <filter-name>SubdomainFilter</filter-name>
   <servlet-name>*</servlet-name>
   <dispatcher>REQUEST</dispatcher>
   <dispatcher>FORWARD</dispatcher>
</filter-mapping>  
0 голосов
/ 12 июня 2013

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

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

Я не уверен, есть ли какие-либо издержки, указав теги диспетчера в файле web.xml, когда вам НЕ НУЖНО, но вы определенноНЕОБХОДИМО, чтобы в web.xml атрибуты работали .

0 голосов
/ 03 июля 2010

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

...