Форвард запрос от фильтра - PullRequest
14 голосов
/ 05 августа 2010

Мне нужно переслать мой запрос (в jsp, но я не думаю, что это имеет значение) из http.Filter, если URI исходного запроса проходит некоторую проверку того, что мой фильтр работает.

Я нашел эту страницу, которая столкнулась с подобной задачей

Тем не менее мне нужно вычислить следующее:

  1. Как я могу получить ServletContext вdoFilter() метод (для вызова API переадресации) getServletContext() не распознается

  2. Должен ли я call chain.doFilter() перед пересылкой, после переадресации или не работать вообще?Кроме того, должен ли я звонить chain.doFilter(), если моя проверка прошла успешно или только если она не прошла (потому что в этом случае я не буду продолжать пересылать свою страницу)?

Этот вопрос фактическипродолжить этот поток , чтобы быть более очевидным, код может быть что-то вроде:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        if (request instanceof HttpServletRequest) {
            HttpServletRequest httpServletRequest = ((HttpServletRequest)request);
            String requestURI = httpServletRequest.getRequestURI();
            String contextPath = httpServletRequest.getContextPath();
            if (<this is my implementation of the validation of this filter>){                                      
                getServletContext().getRequestDispatcher(
                "MySpecific.jsp").forward(request,response);

            }

        }
        chain.doFilter(request,response);

    }

Ответы [ 2 ]

11 голосов
/ 05 августа 2010

Чтобы получить ServletContext, у вас есть 2 варианта:

  • Сохраните FilterConfig во время инициализации и позвоните FilterConfig.getServletContext()

  • вызов HttpServletRequest.getSession().getServletContext()

Я не думаю, что вам обязательно нужно ServletContext, чтобы получить RequestDispatcher, как вы могли бы просто позвонить HttpServletRequest.getRequestDispatcher().

Что касается FilterChain.doFilter() call, если вы переадресовываете, я думаю, что вы не сделаете вызов, так как после переадресации я предполагаю, что вы не хотите, чтобы выполнялось какое-либо стандартное поведение. Если вы не переадресовываете (вы не попадаете в блок if), я бы вызвал метод FilterChain.doFilter(), однако он предполагает, что на другом конце есть цель, которую нужно вызвать.

11 голосов
/ 05 августа 2010

Как я могу получить ServletContext в методе doFilter ()?

httpServletRequest.getSession().getServletContext();

Должен ли я вызывать chain.doFilter () перед форвардом, после форварда илине за что?Кроме того, должен ли я вызывать chain.doFilter (), если моя проверка прошла успешно или только в случае неудачи (потому что в этом случае я не буду продолжать пересылать свою страницу)?

Я бы сказал, чтоесли вы перенаправили запрос, вам не следует звонить chain.doFilter() - перенаправленный запрос будет отфильтрован в соответствии с его собственной конфигурацией фильтра.Однако если ваша проверка не удалась, это зависит от семантики вашего веб-приложения - если исходная страница представляет собой что-то вроде общего экрана с ошибкой / входом в систему / приветствием, возможно, вы захотите продолжить, когда проверка не удалась.Трудно сказать, не зная больше контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...