Запрос вперед с фильтра

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

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

Тем не менее мне нужно сделать следующее:

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

  • Должен ли я иметь 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);

    }

Ответы

Ответ 1

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

httpServletRequest.getSession().getServletContext();

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

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

Ответ 2

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

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

  • call HttpServletRequest.getSession().getServletContext()

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

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