Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Spring + RequestDispatcher


Автор: darkness 9.12.2008, 12:46
Всем доброго времени!
Столкнулся со следующей проблемой:
Начал работать со Spring - создал несколько контроллеро с представленями и т.д.
Необходимо, чтобы при запросе на какую-либо страницу, запрос сначала фильтровался на наличие куков, правильности адреса и проч. И исходя из результатов анализа фильтр переправлял бы на определённую страницу.
Создал я обычный фильтр (implements Filter) , но загвоздка с переправлением! пробовал:
Код

 RequestDispatcher dispat =
              request.getRequestDispatcher("/login.htm");
       dispat.forward(request, response);
  
в этом случае мне серв отвечает (как-будто я там делаю рекурсивный завпрос): 
Код

 java.lang.StackOverflowError
    at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:210)
    at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:229)
    at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:229)
    at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:229)
    at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:229)
    at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:229)
    at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:229)
    at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:229)
    at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:229)
    at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:229)
    at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:229)

  
а так же попробовал так:
Код

 ServletContext sc = RequestContextUtils.getWebApplicationContext(request).getServletContext();
       sc.getRequestDispatcher("/index.htm").forward(request, response);


мне в ответ:
Код

java.lang.IllegalStateException: No WebApplicationContext found: not in a DispatcherServlet request?
    at org.springframework.web.servlet.support.RequestContextUtils.getWebApplicationContext(RequestContextUtils.java:80)
    at org.springframework.web.servlet.support.RequestContextUtils.getWebApplicationContext(RequestContextUtils.java:57)

во втором случае ругается потому, как экземпляр сервлета DispatcherServlet ещё не создан. 

Вообще немного запутался. Плиз, хэлп!!!


да и конфиг web.xml :

Код

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <filter>
        <filter-name>mainFilter</filter-name>
        <filter-class>index.mainFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>mainFilter</filter-name>    <!--мой фильтр -->
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>t1</servlet-name>
        <servlet-class>t1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>t1</servlet-name>
        <url-pattern>/t1</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>redirect.jsp</welcome-file>
        </welcome-file-list>
    </web-app>





Автор: Kangaroo 9.12.2008, 13:38
Цитата(darkness @  9.12.2008,  12:46 Найти цитируемый пост)
в этом случае мне серв отвечает (как-будто я там делаю рекурсивный завпрос): 

Так ты его и делаешь.
Пытаешься зайти на /админ.штмл -> фильтр перенаправляет на /логин.штмл -> фильтр опять перенаправляет на /логин.штмл -> ....

Покажи код фильтра.
И почитай про интерсепторы в Cпринге, чтобы не мучиться с фильтрами.

Автор: darkness 9.12.2008, 17:00
Вот код фильтра:
Код

  public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
    throws IOException, ServletException {

    if (debug) log("mainFilter:doFilter()");

    doBeforeProcessing(request, response);

    Throwable problem = null;
    try {
     

     request.setAttribute("count", "0");      //вот банально я пытаюсь избежать рекурсии, ведь request один и от же
   if(!request.getAttribute("count").equals("1"))
   {
         RequestDispatcher dispat =
              request.getRequestDispatcher("/index.htm");
       dispat.forward(request, response);
       request.setAttribute("count", "1");
     }
     else
       chain.doFilter(request, response);
    }
    catch(Throwable t) {
        problem = t;
        t.printStackTrace();
    }

    doAfterProcessing(request, response);

    if (problem != null) {
        if (problem instanceof ServletException) throw (ServletException)problem;
        if (problem instanceof IOException) throw (IOException)problem;
        sendProcessingError(problem, response);
    }
    }

Сейчас посмотрю интерсепоторы, но мне бы очено хотелось понять что тут не так с этим фильтром...

Автор: _sten_ 9.12.2008, 19:49
Цитата

... но мне бы очено хотелось понять что тут не так с этим фильтром... 


Цитата

 <filter-mapping>
        <filter-name>mainFilter</filter-name>    <!--мой фильтр -->
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
 </filter-mapping>


Цитата

       RequestDispatcher dispat =
              request.getRequestDispatcher("/index.htm");
       dispat.forward(request, response);


делаеш форвард на /index.htm который попадает под патерн <url-pattern>/*</url-pattern> - врезультате попадаеш опять на этот-же фильтр.

А вобще скорей всего те спринговый инроцептор надо юзать

Автор: Kangaroo 9.12.2008, 20:36
Цитата(darkness @  9.12.2008,  17:00 Найти цитируемый пост)
вот банально я пытаюсь избежать рекурсии, ведь request один и от же

Странно ты избегаешь рекурсии smile

Код

Установить каунт = 0
Если каунт НЕ РАВЕН 1 - перейти в начало.


_sten_ выше написал почему.

Автор: darkness 10.12.2008, 06:37
Ребята, спасибо - разобрался и с фильтрами и с интерсепотрам (кстати, действительно удобная штука).
Только вот вопрос, нигде не нашёл ответа: каким образом можно в этом url-паттерне поставить отрицание, т.е., к примеру,  "все страницы кроме index.htm ?


Kangaroo
Цитата

Странно ты избегаешь рекурсии 

и не говори - на свежую голову глянул - сам ужаснулся

Автор: Kangaroo 10.12.2008, 11:01
Цитата(darkness @  10.12.2008,  06:37 Найти цитируемый пост)
Только вот вопрос, нигде не нашёл ответа: каким образом можно в этом url-паттерне поставить отрицание, т.е., к примеру,  "все страницы кроме index.htm ?

Нормальным способом - нельзя.

Автор: darkness 10.12.2008, 12:09
Понятно. Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)