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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с фильтром 
:(
    Опции темы
katala
Дата 8.5.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



пробую написать фильт который проверяет если пользователь не логинился то его перекыдывает на страницу  для регистриции. вот фильт 
Код

package filter;
import javax.servlet.*;    
import javax.servlet.http.HttpServletRequest;    
import javax.servlet.http.HttpServletResponse;    
import javax.servlet.http.HttpSession;    
import java.io.IOException;    
public class SessionCheckerFilter implements Filter {    
    public void init(FilterConfig filterConfig) throws ServletException {    
     
    }    
    public void destroy() {    
    }    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {    
        HttpServletRequest req = (HttpServletRequest) request;    
        HttpServletResponse res = (HttpServletResponse) response;    
        String contextPath = req.getContextPath();    
        HttpSession session = req.getSession(false);    
        if(session!=null && session.getAttribute("username")!=null) {    
            chain.doFilter(request, response);    
        } else {    
            if(req.getRequestURI().equals(contextPath+"/index.html") || req.getRequestURI().equals(contextPath+"/showRegistration.html")) {    
                chain.doFilter(request, response);    
            
            } else {    
                res.sendRedirect(contextPath + "/showRegistration.html");    
            }    
        }    
    }    
}

вот то что пишу в web.xml
Код

       <filter>    
        <filter-name>SessionCheckerFilter</filter-name>    
        <filter-class>filter.SessionCheckerFilter</filter-class>    
        <init-param>    
            <param-name>requestEncoding</param-name>    
            <param-value>windows-1251</param-value>    
        </init-param>
    </filter>
    
       <filter-mapping>    
         <filter-name>SessionCheckerFilter</filter-name>    
         <url-pattern>/*</url-pattern>    
      </filter-mapping>

И ПРИ ПОПЫТКЕ ЗАГРУЗИТЬ ПРОЕКТ МЕНЯ СРАЗУ КИДАЕТ В .../showRegistration.html
Я ПРОВЕРИЛ ДАННЫЕ(ДО ИСПОЛЬЗОВАНИЯ ФИЛЬТРА)
req.getRequestURI() В НАЧАЛЬНЫЙ этап возращеат /kurs/index.html а 
req.getContextPath(); /index.html. вот я и немогу понять почему
 req.getRequestURI().equals(contextPath+"/index.html") возвращает false(а так оно
и есть ведь кидает же на ../showRegistration.html   только почему еще и страниуа пустая????) вообщем где то я допустил ошибку. подскажите я то я с фильтрами только начал работать!!!! 
PM MAIL   Вверх
Tirael
Дата 8.5.2006, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Что-то очень знакомый код фильтра ))))
Щас подумаю.......

Добавлено @ 21:42 
Какие-то проблемы у меня возникали я помню. Сделай так: 
Код

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionCheckerFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        String contextPath = req.getContextPath();
        HttpSession session = req.getSession(false);
        System.out.println("=SessionCheckerFilter: session= " + session);
        System.out.println("=SessionCheckerFilter: requestURI= " + req.getRequestURI());
        if(session!=null && session.getAttribute("username")!=null) {
            System.out.println("======SessionCheckerFilter: username= " + session.getAttribute("username"));
            chain.doFilter(request, response);
        } else {
            if(req.getRequestURI().equals(contextPath+"/login")) {
                chain.doFilter(request, response);
            } else {
                System.out.println("======SessionCheckerFilter: redirecting to " + contextPath + "/login");
                res.sendRedirect(contextPath + "/login");
            }
        }
    }
}


И скажи что будет у тебя на консоли

Добавлено @ 21:45 
Кажется я понял, что тебе не понятно. Когда ты делаешь запрос, фильтр срабатывает два раза. Первый при твоем запросе. А второй, когда ты делаешь 
Код

                res.sendRedirect(contextPath + "/showRegistration.html");    

В этом случае запрос опять проходит через фильтр, но req.getRequestURI() уже будет другим. 

Цитата(katala @  8.5.2006,  21:13 Найти цитируемый пост)
олько почему еще и страниуа пустая

Код страницы в студию ))) 

Это сообщение отредактировал(а) Tirael - 8.5.2006, 21:39
--------------------
 
PM MAIL   Вверх
katala
Дата 8.5.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



вот что у меня получилось. 
вот еще раз код фильтра 
Код

package filter;
import javax.servlet.*;    
import javax.servlet.http.HttpServletRequest;    
import javax.servlet.http.HttpServletResponse;    
import javax.servlet.http.HttpSession;    
import java.io.IOException;    
public class SessionCheckerFilter implements Filter {    
    public void init(FilterConfig filterConfig) throws ServletException {    
     
    }    
    public void destroy() {    
    }    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {    
        HttpServletRequest req = (HttpServletRequest) request;    
        HttpServletResponse res = (HttpServletResponse) response;    
        String contextPath = req.getContextPath();    
        HttpSession session = req.getSession(false);    
        System.out.println("=SessionCheckerFilter: session= " + session);    
        System.out.println("=SessionCheckerFilter: requestURI= " + req.getRequestURI());
        System.out.println("=SessionCheckerFilte: contextPath= " + contextPath); 
        if(session!=null && session.getAttribute("username")!=null) {    
            System.out.println("======SessionCheckerFilter: username= " + session.getAttribute("username"));
            chain.doFilter(request, response);    
        } else {    
            if(req.getRequestURI().equals(contextPath+"/") || req.getRequestURI().equals(contextPath+"/showRegistration.html")) {    
                chain.doFilter(request, response);    
            
            } else 
            {    
                System.out.println("======SessionCheckerFilter: redirecting to " + contextPath + "/showRegistration.html");
                res.sendRedirect(contextPath + "/showRegistration.html");    
            }    
        }    
    }    
}

немного исправил и теперь когда просто запускаю проект 
то на консоли пишут 
Код

=SessionCheckerFilter: session= null
=SessionCheckerFilter: requestURI= /kurs/
=SessionCheckerFilte: contextPath= /kurs

то есть у меня остается как  надо главная страничка. но как только я пытаюсь перейти на какую нибудь другую страничку то сразу появляются проблемы!!!!
вот что пишется на консили 
Код

=SessionCheckerFilter: session= org.apache.catalina.session.StandardSessionFacade@51064e
=SessionCheckerFilter: requestURI= /kurs/showMail.html
=SessionCheckerFilte: contextPath= /kurs
======SessionCheckerFilter: redirecting to /kurs/showRegistration.html
=SessionCheckerFilter: session= org.apache.catalina.session.StandardSessionFacade@51064e
=SessionCheckerFilter: requestURI= /kurs/showRegistration.html
=SessionCheckerFilte: contextPath= /kurs

=SessionCheckerFilter: session= org.apache.catalina.session.StandardSessionFacade@51064e
=SessionCheckerFilter: requestURI= /kurs/templates/template.css
=SessionCheckerFilte: contextPath= /kurs
======SessionCheckerFilter: redirecting to /kurs/showRegistration.html
=SessionCheckerFilter: session= org.apache.catalina.session.StandardSessionFacade@51064e
=SessionCheckerFilter: requestURI= /kurs/showRegistration.html
=SessionCheckerFilte: contextPath= /kurs

вот тут то мне ничего не понятно. откудава появляются такие записи типа 
/kurs/templates/template.css????
и вообще как сделать что бы просто перекидывало на нужную страницу а не проверяло два раза ????? 
PM MAIL   Вверх
Tirael
Дата 8.5.2006, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



хмм...дайте код, где вы регистрируете пользователя, т.е. пишите в сессию атрибут "username". Дайте так же код showRegistration.html. Возможно с этой страницы и запрашивается templates/template.css

Добавлено @ 22:37 
Цитата(katala @  8.5.2006,  22:17 Найти цитируемый пост)
и вообще как сделать что бы просто перекидывало на нужную страницу а не проверяло два раза ????? 

Оно проверяет два раза, если пользователь не зарегистрирован. Точнее так получается что проверяет. Вы вызываете страницу. Фильтр проверяет, говорит, что туда нельзя, и посылает на другую страницу. Перейдя на другую страницу фильтр опять проверяет, можно ли вам на нее зайти. И пропускает. Лично я ничего особенно плохого не вижу.
Можно в принципе использовать не редирект, а диспатчер, но тогда в браузере строка адреса не будет меняться.

Добавлено @ 22:39 
Да...можно еще фильтр замапить особым образом: на все страницы, кроме той, где вы логинитесь. Тогда будет все нормально.  
--------------------
 
PM MAIL   Вверх
katala
Дата 8.5.2006, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



вот showRegistration.html 
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<LINK href="templates/template.css" type=text/css rel=stylesheet>
</head>
<body  bgcolor="#000000">
Все 
    #parse("menu.vm")<br>
    Все данные необходимо записывать только на латинском<br>
    #if($error_exist)
        <font size=+2 class=error>ОШИБКА ВХОДА В СИСТЕМУ</font><br>
        #foreach($error in $errors)
            <font class=error>$error.msg</font><br>
        #end
    #end
    <form name="regForm" method="post" action="registration.html">
        <input type="hidden" name="action" value="registration"/>
        Псевдоним:
        <input type="text" name="penname" value="$client.penname" class=inup size="12"><br>
        Пароль(6-10 символов):
        <input type="password" name="password" value="$client.password" class=inup><br>
        Повтор ввода пароля:
        <input type="password" name="password2" value="" class=inup><br>
        Адрес эл. почты(адрес должен существовать):
        <input type="text" name="email" value="$client.email" class=inup SIZE="20"><br>
        Имя:
        <input type="text" name="name" value="$client.name" class=inup><br>
        Фамилия:
        <input type="text" name="surname" value="$client.surname" class=inup><br>
        Курс*:
        <input type="text" name="kurs" value="$client.kurs" class=inup><br>
        Факультет*:
        <input type="text" name="faculty" value="$client.faculty" class=inup><br>        
        <input type="submit" name="register" value="Зарегистировать" class=btn><br>
        <br> Поля помеченные(*) не являются обязательными а необходимы только для студентов 
    </form>
    
</body>
</html>

 вод код передачи в сесию атрибута

Код

                         addError("Congratulations! You've registered");
                template = Velocity.getTemplate("main.vm");
                request.getSession().setAttribute("username", "1");
                return mapping.findForward("/registration");

и еще одна вещь интересная появилась: почему то стали игнорироваться мои настроийки записанные в template.css(вот он этот файл но как он в фильтр попал ума не приложу) . то есть фильтр елси отдключаю они используютя как надо как только подключаю-все никакой реакции!!!1

Добавлено @ 22:57 
Цитата

Да...можно еще фильтр замапить особым образом: на все страницы, кроме той, где вы логинитесь. Тогда будет все нормально.  
 а как это сделать????7 
PM MAIL   Вверх
Tirael
Дата 8.5.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



<LINK href="templates/template.css" type=text/css rel=stylesheet>
что это за ссылочка. Полагаю, что твоя страница пытается обратиться к templates/template.css, а запрос попадает в руки к фильтру. А фильтр не дает пройти. Вот потому настройки записаннные там игнорируются. В этом вся проблема ) 
--------------------
 
PM MAIL   Вверх
katala
Дата 8.5.2006, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



этот подключение файла с настройками вот кусочег его текста  
Код

BODY {
        SCROLLBAR-FACE-COLOR: #2B1F16; 
        SCROLLBAR-HIGHLIGHT-COLOR: #4A3E32;
        SCROLLBAR-SHADOW-COLOR: #9B8D7E;
        SCROLLBAR-3DLIGHT-COLOR: #9B8D7E;
        SCROLLBAR-ARROW-COLOR: #646666;
        SCROLLBAR-TRACK-COLOR: #646666;
        SCROLLBAR-DARKSHADOW-COLOR: black;

    FONT-SIZE: 11px; COLOR: #999999; FONT-FAMILY: Arial; TEXT-DECORATION: NONE
}

.error {    FONT-SIZE: 8pt;
    COLOR: #ff0000;
    FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif;
}

.font1 {    
    FONT-SIZE: 8pt;
    COLOR: #66CCFF;
    FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif;
}

.font2 {    
    FONT-SIZE: 8pt;
    COLOR: #ffdd00;
    FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif;
}
.font3_none {    
    FONT-SIZE: 14pt;
    COLOR: #FFDD00;
    FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif;
}
.font1_inv {    
    FONT-SIZE: 8pt;
    COLOR: #ffffff;
    FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif;
}

 и он очень нужен. может можно как нибудь забацать чтобы фильт его инорировал??? да еще ты не ответил 
как енто сделать 
Цитата

Да...можно еще фильтр замапить особым образом: на все страницы, кроме той, где вы логинитесь. Тогда будет все нормально.  
 
PM MAIL   Вверх
Tirael
Дата 8.5.2006, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(katala @  8.5.2006,  22:56 Найти цитируемый пост)
а как это сделать????7 

Вообщем-то я тоже задавал такой вопрос, и если помниться, не получил ответа.
Могу предложить плохой (как мне кажется) способ. Сделайте так чтоб ваша страница с регистрацией находилась, например, по адресу / 
А все остальные страницы, доступ к которым осуществляется только после регистрации, положите, например, в /pages

Далее в web.xml заменити строчку 
Код

<url-pattern>/*</url-pattern>    

на 
Код

<url-pattern>/pages/*</url-pattern>    

Тогда фильтр будет фильтрить все запросы которые идут по адресу /pages/*. А те что идут по адресу /* (например /showRegistration.html или /templates/template.css) фильтриться не будут. А это то нам и надо

Добавлено @ 23:18 
Цитата(katala @  8.5.2006,  23:14 Найти цитируемый пост)
кусочег

 smile   smile  smile 
Собственно вторая часть должна была быть присобачена к первой ))) но ты меня опередил )  

Это сообщение отредактировал(а) Tirael - 8.5.2006, 23:20
--------------------
 
PM MAIL   Вверх
katala
Дата 8.5.2006, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



все понял спасибо!!! и не  надо говорить сделайТЕ  smile я еще ничего особого не достиг в программировании да и плюс мне только 20 лет. думаю ты старше так что это мне надо говорить на ВЫ smile .  а как поступить с <LINK href="templates/template.css" type=text/css rel=stylesheet>???? без него ваще туго. не охото триста раз писать одно и тоже smile. может есть какие нибудь идие ???? 
PM MAIL   Вверх
Tirael
Дата 8.5.2006, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(katala @  8.5.2006,  23:24 Найти цитируемый пост)
 а как поступить с <LINK href="templates/template.css" type=text/css rel=stylesheet>

Ну собственно кажется то решение которое я дал подойдет. Если у тебя будет такая структура 

/
   showRegistraton.html
/templates
      template.css
/pages
      bla-bla-bla

То все должно быть нормально. Ведь фильтр будет проверять только те запросы, которые идут через /pages 
а все остальные пропускать.

Попробуй. Должно подействовать. 

Вообще есть такая штука - JAAS. Расшифровывается как Java Authentication and Authorization Service. Сам я еще эту технологию не изучал, но люди говорят вещь хорошая. По идее она должна решить все твои проблемы с аутентификацией и авторизацией пользователей.   

Это сообщение отредактировал(а) Tirael - 8.5.2006, 23:39
--------------------
 
PM MAIL   Вверх
katala
Дата 9.5.2006, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

/
   showRegistraton.html
/templates
      template.css
/pages
      bla-bla-bla

ок попробую но уже завтра.я только одного понять не могу как только  пользователь регается все нормально настройки начинают использоваться почему только не понятно 
PM MAIL   Вверх
Tirael
Дата 9.5.2006, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(katala @  9.5.2006,  00:10 Найти цитируемый пост)
ок попробую но уже завтра.я только одного понять не могу как только  пользователь регается все нормально настройки начинают использоваться почему только не понятно 

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

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

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


 




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


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

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