Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Spring + RequestDispatcher 
:(
    Опции темы
darkness
Дата 9.12.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 5.8.2006
Где: Москва

Репутация: нет
Всего: 1



Всем доброго времени!
Столкнулся со следующей проблемой:
Начал работать со 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>





--------------------
Вина каких стран Вы предпочитаете в это время суток?     (Булгаков. "Мастер и Маргарита") 
PM MAIL   Вверх
Kangaroo
Дата 9.12.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



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

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

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


--------------------
Lost....
PM MAIL MSN   Вверх
darkness
Дата 9.12.2008, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 5.8.2006
Где: Москва

Репутация: нет
Всего: 1



Вот код фильтра:
Код

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

Сейчас посмотрю интерсепоторы, но мне бы очено хотелось понять что тут не так с этим фильтром...
--------------------
Вина каких стран Вы предпочитаете в это время суток?     (Булгаков. "Мастер и Маргарита") 
PM MAIL   Вверх
_sten_
Дата 9.12.2008, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 29.9.2006

Репутация: 3
Всего: 3



Цитата

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


Цитата

 <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> - врезультате попадаеш опять на этот-же фильтр.

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

--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' !
PM MAIL ICQ   Вверх
Kangaroo
Дата 9.12.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



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

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

Код

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


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


--------------------
Lost....
PM MAIL MSN   Вверх
darkness
Дата 10.12.2008, 06:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 5.8.2006
Где: Москва

Репутация: нет
Всего: 1



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


Kangaroo
Цитата

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

и не говори - на свежую голову глянул - сам ужаснулся
--------------------
Вина каких стран Вы предпочитаете в это время суток?     (Булгаков. "Мастер и Маргарита") 
PM MAIL   Вверх
Kangaroo
Дата 10.12.2008, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



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

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


--------------------
Lost....
PM MAIL MSN   Вверх
darkness
Дата 10.12.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 5.8.2006
Где: Москва

Репутация: нет
Всего: 1



Понятно. Спасибо.
--------------------
Вина каких стран Вы предпочитаете в это время суток?     (Булгаков. "Мастер и Маргарита") 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1398 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.