Как определить из фильтра, какой jsp был перенаправлен из вызова RequestDispatcher.forward? - PullRequest
2 голосов
/ 27 января 2012

У меня есть фильтр, который обрабатывает запросы, чтобы регистрировать их, поэтому я могу отслеживать, какой сеанс зашел на страницу и в какое время с какими параметрами запроса. отлично работает ... отправка сообщений из jsp в jsp или прямой вызов в jsp. Однако, когда форма отправляется сервлету, который перенаправляет этот запрос в новый jsp, я не могу увидеть, в какой jsp запрос был перенаправлен.

Например, предположим, у меня есть страница входа в систему, которая отправляет сообщение в LoginServlet, который затем перенаправляет запрос в index.jsp или index1.jsp. Как я могу определить из запроса, возвращает ли LoginServlet index.jsp или index1.jsp?

Это в среде Java 1.5, использующей спецификацию сервлета 2.3.

public class PageLogFilter implements Filter {

    FilterConfig filterConfig = null;

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }

    public void destroy() {
        this.filterConfig = null;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        try {
            if (request instanceof HttpServletRequest) {
                HttpServletRequest req = (HttpServletRequest) request;
                HttpSession session = req.getSession(false);

                //For non-forwards, I can call req.getRequestURI() to determine which 
                //page was returned. For forwards, it returns me the URI of the  
                //servlet which processed the post. I'd like to also get the URI
                //of the jsp to which the request was forwarded by the servlet, for
                //example "index.jsp" or "index1.jsp"
            }
        } catch (Exception e {
            System.out.println("-- ERROR IN PageLogFilter: " + e.getLocalizedMessage());
        }

        chain.doFilter(request, response);
    }
}

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Если у вас все в порядке с выполнением дополнительной проверки, вы можете использовать атрибут для установки / получения URI исходного запроса. В вашем LoginServlet установите атрибут:

//LoginServlet
public void doFilter(...) {
      HttpServletRequest oReq = (HttpServletRequest)request;
      ..
      ...
      //save original request URI
      oReq.setAttribute("originalUri", oReq.getRequestURI());
}

и в вашей PageLogFilter проверке, имеет ли атрибут originalUri значение, рассмотрите это значение как URI запроса

//PageLogFilter 
public void doFilter(...) {
      HttpServletRequest req = (HttpServletRequest) request;
      if(req.getAttribute("originalUri") != null) {
          String strOriginalUri = (String) req.getAttribute("originalUri");
          //set it back to null
      req.setAttribute("originalUri", null);
      }
}
0 голосов
/ 27 января 2012

Хотя это не поможет решить вашу непосредственную проблему, в Servlet 2.4 добавлен более подробный контроль диспетчера, что вам и нужно.

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

<filter-mapping>
       <filter-name>PageLogFilter</filter-name>
       <url-pattern>/*</url-pattern>
       <dispatcher>FORWARD</dispatcher>
</filter-mapping>

Следующая статья объясняет это более подробно

http://www.ibm.com/developerworks/java/library/j-tomcat2/

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