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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Sessions, Servlets, JSPX, Откуда берется сессия ? 
:(
    Опции темы
Tirael
Дата 25.4.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Преамбула
Пишу чат.
Есть несколько сервлетов и есть фильтр, который не позволяет обращатся к сервлетам если нет сессии. Сервлеты по надобности диспатчерятся на jspx страницы.
В программе только два места, где явно идет работа с сессией: это собственно фильтр и LoginServlet. 

Амбула
Дважды обратившись, например, к сервлету на терминале пишется :
Код

18:50:18,484 INFO  [STDOUT] requestURL: /vchat/login
18:50:18,484 INFO  [STDOUT] sesion= null
18:50:28,765 INFO  [STDOUT] requestURL: /vchat/login
18:50:28,765 INFO  [STDOUT] sesion= org.apache.catalina.session.StandardSessionFacade@1ed7afd

ОТКУДА ВЗЯЛАСЬ СЕССИЯ ??????

Вот код фильтра: 
(LoginServlet развернут на /vchat/login
Код

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("requestURL: "+req.getRequestURI());
        System.out.println("sesion= "+ session);
        if (req.getRequestURI().equals(contextPath+"/login")) {
            chain.doFilter(request, response);
        } else {
            if (session == null) {
                res.sendRedirect(contextPath + "/login");
            } else {
                chain.doFilter(request, response);
            }
        }
    }
}

По идее он не создает сессии. 

Вот код LoginServlet
Код

public class LoginServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String contextPath=request.getContextPath();
        String username = request.getParameter("username");
        int minimumNicknameLength = Integer.parseInt(getServletContext().getInitParameter("MinimumNicknameLength"));
        if( username != null && username.length() >= minimumNicknameLength && username.indexOf(" ")==-1) {
            try {
                ChatRoomList roomList = (ChatRoomList)getServletContext().getAttribute("roomList");
                boolean ifExists = roomList.chatterExists(username);
                if(ifExists) {
                    request.setAttribute("error", 1);
                    request.setAttribute("userexists", 1);
                    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jspx/login.jspx");
                    dispatcher.forward(request, response);
                } else {
                    System.out.println("session ok");
                    HttpSession session = request.getSession(true);
                    System.out.println("session ok");
                    int timeout = Integer.parseInt(getServletContext().getInitParameter("SessionTimeout"));
                    timeout=timeout*60;
                    session.setMaxInactiveInterval(timeout);
                    session.setAttribute("username", username);
                    Chatter chatter = new Chatter(username, "m", new java.util.Date().getTime());
                    ChatRoom chatRoom = roomList.getRoom("StartUp");
                    chatRoom.addChatter(chatter);

                    response.sendRedirect(contextPath+"/rooms");
                }
            } catch(Exception e) {};
        } else {
            request.setAttribute("error", 1);
            request.setAttribute("badname", 1);
            RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jspx/login.jspx");
            dispatcher.forward(request, response);
            
            //response.sendRedirect(contextPath+"/login.jspx");
        }
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
        //RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jspx/login.jspx");
        //dispatcher.forward(request, response);
    }
}

В моем случае здесь тоже не создается сессии ( на терминал ничего не выводится!!!)

Мои подозрения падают на jspx страницу, где я обращаюсь к атрибуту сессии ${username == null}. Точнее сказать не к атрибуту именно сессии, а атрибут ищется сначала в реквесте, потом в сессии, потом в контексте. 

МОЖЕТ ЛИ ТАКОЕ ОБРАЩЕНИЕ НЕЯВНО СОЗДАВАТЬ СЕССИЮ ? 

Вот код jspx страницы ?
Код

<?xml version="1.0" encoding="UTF-8"?>
<jsp:root
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:jsp="http://java.sun.com/JSP/Page"
    xmlns:x="http://java.sun.com/jsp/jstl/xml"
    version="2.0">

  <jsp:directive.page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" />
  <jsp:directive.page errorPage="/WEB-INF/jspx/error.jspx"/>
    <fmt:setBundle basename="VChatBundle"></fmt:setBundle>
    <html>
        <meta http-equiv="pragma" content="no-cache" />
        <meta http-equiv="expires" content="Wed, 26 Feb 1997 08:21:57 GMT" />
        <head>
            <title>
                <fmt:message key="vchat.title"></fmt:message>
            </title>
        </head>
    <body>
    <center>
        <c:choose>
            <c:when test="${username == null}" >
                <c:choose>
                    <c:when test="${error != null}">
                      <c:if test="${badname != null}">
                         <fmt:message key="vchat.error.bad.name"/> <BR/>
                      </c:if>
                      <c:if test="${userexists != null}">
                         <fmt:message key="vchat.error.user.exists"/>
                      </c:if>
                    </c:when>
                    <c:otherwise>
                      <fmt:message key="vchat.greeting.welcome"/>, <fmt:message key="vchat.greeting.guest"/> !!! <BR/>
                    </c:otherwise>
                </c:choose>
                <fmt:message key="vchat.greeting.entername"/> !
                <form method="POST" action="${request.contextPath}/login">
                    Name:   <input type="TEXT" name="username" size="25"/>  <BR/>

                    <fmt:message key="vchat.botton.submit" var="submitText"/>
                    <input type="SUBMIT" value="${submitText}"/>

                    <fmt:message key="vchat.botton.reset" var="resetText"/>
                    <input type="RESET" value="${resetText}"/>
                </form>
            </c:when>
            <c:otherwise>
                <fmt:message key="vchat.greeting.welcome"/>, ${username} !!! <BR/>
                <form  method="POST" action="${request.contextPath}/logout">
                    <fmt:message key="vchat.botton.logout" var="logout"/>
                    <INPUT type="SUBMIT" value="${logout}"/>
                </form>
            </c:otherwise>
        </c:choose>
    </center>
    </body>
    </html>
</jsp:root>

 
--------------------
 
PM MAIL   Вверх
tux
Дата 26.4.2006, 03:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Видишь ли, сессию создает сервер приложений сам, то есть обычно тебе не надо для этого предпринимать что-то специальное. Веб-контейнер работает по принципу "клиент-сервер", при этом единственный момент когда сессия не существует - это когда был послан запрос (request) клиентом, но еще не сформирован ответ сервера (response). В процессе этого первого обмена браузер и веб-контейнер обмениваются информацией, котороая позволяет идентифицировать сессию, то есть сервер просто выдает клиенту идентификатор сессии, которым клиент далее сопровождает все запросы. Это позволяет серверу определить к какой сессии относится запрос. Вот собственно по этому в момент первого вызова listener сессия равна null, а при втором вызове сессия уже существует. 
PM MAIL Skype GTalk Jabber YIM   Вверх
Tirael
Дата 26.4.2006, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



вот подстава... smile 

tux, thnx  smile  если б Мог,  нажал бы [+]

Еще несколько вопросов: 
1. А можно ли это отключить как-нибудь? Сервер - JBoss. Не то чтоб очень надо, а просто ради интереса.
2. Получается, что все что мне надо, это просто проверять не только наличие сессии, но и наличие в ней моего аттрибута идентефицирующего пользователя, ловя вовремя нули и эксепшены?

(JAAS не предлогать smile )  

Это сообщение отредактировал(а) Tirael - 26.4.2006, 19:55
--------------------
 
PM MAIL   Вверх
tux
Дата 27.4.2006, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(Tirael @  26.4.2006,  22:46 Найти цитируемый пост)
1. А можно ли это отключить как-нибудь? Сервер - JBoss. Не то чтоб очень надо, а просто ради интереса.

Создание и поддержание сессии определяет стандарт J2EE, поэтому никаких отключений. 

Цитата(Tirael @  26.4.2006,  22:46 Найти цитируемый пост)
2. Получается, что все что мне надо, это просто проверять не только наличие сессии, но и наличие в ней моего аттрибута идентефицирующего пользователя, ловя вовремя нули и эксепшены?

Если ты хочешь сделать перенаправление пользователя на логин если он еще не идентифицировал себя, то да, так и поступают.

Цитата(Tirael @  26.4.2006,  22:46 Найти цитируемый пост)
(JAAS не предлогать smile )  

Если работаешь с JBoss, то использование JAAS было бы неплохим решением создания системы безопасности потому как JBoss уже кое-что для этого уже предоставляет. Правда при этом будешь навсегда к нему привязан.

Раз уж тебя интересует система безопасности, то вот ссылка - http://acegisecurity.org/
PM MAIL Skype GTalk Jabber YIM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0862 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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