2010-08-05 2 views
13

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

Я нашел это page that faced similar task

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

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

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

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

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); 

    } 

ответ

10

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

httpServletRequest.getSession().getServletContext(); 

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

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

10

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

  • магазин прочь от FilterConfig во время инициализации и вызвать FilterConfig.getServletContext()

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

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

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

+0

оба ответа были в порядке. Другой был первым. – Spiderman

+0

Храните фильтр FilterConfig во время инициализации и вызывайте FilterConfig.getServletContext() Это мой предпочтительный метод, так как у меня нет сеанса явно: – Gurnard