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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> j_security_check и HTTP Status 404, Ошибка при повторном входе. 
:(
    Опции темы
rimidal
Дата 21.7.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Серевер приложений - GlassFish v2. Изучаю примеры из Sun-го туториала. 
hello1_formauth - собственно в этом примере я столкнулся с этой ошибкой (кроме этого примера такая же ошибка наблюдается и в админке самого GlassFish-а).

Ошибка возникает после следующих действий: открываем страничку авторизации (например http://localhost:8080/hello1_formauth/logon.jsp) , вводим логин и пароль после чего успешно переходим на "защищенную" страничку (например http://localhost:8080/hello1_formauth/index.jsp),  теперь если в браузере нажать кнопку назад и попытаться еще раз пройти авторизацию то возникает ошибка 404.

Возможно ли сделать так чтобы повторная авторизация была возможна (чтоб сервер сам завершал предыдущую сессию и открывал новую)? 
PM MAIL   Вверх
jokodzuma
Дата 21.7.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


Шустрый
*


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

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



Цитата

сервер сам завершит сессию через тридцать минут (по умолчанию) в случае бездействия клиента. клиент сможет завершить сессию, послав серверу запрос на завершение, прежде чем захочет начать новую.

Это все понятно... Если таймаут истек то таких проблем не возникает.
Можно например перехватывать все обращения к j_security_check и смотреть факт авторизации и пытаться сделать переадресацию или что-то вроде.
Меня интересует почему сам j_security_check (это наверное какой-то стандартный сервлет) не доступен после авторизации сесcии?

Вот что я пытался сделать:
часть кода фильтра перехватывающего обращения к j_security_check

Код

         ...
         if(request instanceof HttpServletRequest){
              HttpServletRequest req = (HttpServletRequest)  request;
              if((req.getRemoteUser()==null)||(req.getRemoteUser().equals(""))){
                 chain.doFilter(request, response);
              }
              else{
                HttpSession ses = req.getSession(false); 
                ses.invalidate();
                ses=req.getSession(true);
                chain.doFilter(request, response);

                // или как вариант вместо  chain.doFilter(request, response);
                // но это не совсем то чтобы хотелось
                // ((HttpServletResponse)response).sendRedirect("logon.jsp");

              }
         }
          ...


В результате все равно имеем Error 404.
PM MAIL   Вверх
jokodzuma
Дата 21.7.2008, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(rimidal @ 21.7.2008,  13:43)
Цитата

сервер сам завершит сессию через тридцать минут (по умолчанию) в случае бездействия клиента. клиент сможет завершить сессию, послав серверу запрос на завершение, прежде чем захочет начать новую.

Это все понятно... Если таймаут истек то таких проблем не возникает.
Можно например перехватывать все обращения к j_security_check и смотреть факт авторизации и пытаться сделать переадресацию или что-то вроде.
Меня интересует почему сам j_security_check (это наверное какой-то стандартный сервлет) не доступен после авторизации сесcии?

Вот что я пытался сделать:
часть кода фильтра перехватывающего обращения к j_security_check

Код

         ...
         if(request instanceof HttpServletRequest){
              HttpServletRequest req = (HttpServletRequest)  request;
              if((req.getRemoteUser()==null)||(req.getRemoteUser().equals(""))){
                 chain.doFilter(request, response);
              }
              else{
                HttpSession ses = req.getSession(false); 
                ses.invalidate();
                ses=req.getSession(true);
                chain.doFilter(request, response);

                // или как вариант вместо  chain.doFilter(request, response);
                // но это не совсем то чтобы хотелось
                // ((HttpServletResponse)response).sendRedirect("logon.jsp");

              }
         }
          ...


В результате все равно имеем Error 404.

1. Контекст j_security_check нельзя перехватывать согласно спецификации сервлетов, по крайней мере 2.3. Что за сервер, какая версия сервлетов?
2. Что в строке отображается в строке адреса после нажатия кнопки "назад"? Какой браузер, какой версии?
PM MAIL   Вверх
rimidal
Дата 21.7.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сервер: Sun Java System Application Server 9.1_02 (build b04-fcs)
Строке адреса после нажатия кнопки "назад":https://localhost:8181/hello1_formauth/logon.jsp
Версия сервлетов (если я не ошибаюсь): 2.4

На всякий случай привожу xml файлы:
web.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<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">

  <display-name>hello1_formauth</display-name>
  
    <filter>
        <filter-name>JSecCheckSimpleFilter</filter-name>
        <filter-class>hello.filters.JSecCheckSimpleFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>JSecCheckSimpleFilter</filter-name>
        <url-pattern>/j_security_check</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    <servlet>
    <display-name>index</display-name>
    <servlet-name>index</servlet-name>
    <jsp-file>/index.jsp</jsp-file>
  </servlet>
    <session-config>
        <session-timeout>1</session-timeout>
    </session-config>
    <error-page>
        <error-code>404</error-code>
        <location>/errorPage404.jsp</location>
    </error-page>
    <security-constraint>
    <display-name>SecurityConstraint</display-name>
    <web-resource-collection>
      <web-resource-name>WRCollection</web-resource-name>
            <description/>
            <url-pattern>/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
            <http-method>HEAD</http-method>
            <http-method>PUT</http-method>
            <http-method>OPTIONS</http-method>
            <http-method>TRACE</http-method>
            <http-method>DELETE</http-method>
            </web-resource-collection>
    <auth-constraint>
      <role-name>loginUser</role-name>
    </auth-constraint>
        <user-data-constraint>
            <description/>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
        </security-constraint>
    <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>file</realm-name>
        <form-login-config>
            <form-login-page>/logon.jsp</form-login-page>
            <form-error-page>/logonError.jsp</form-error-page>
            </form-login-config>
        </login-config>
    <security-role>
    <role-name>loginUser</role-name>
  </security-role>  
  

</web-app>

 


sun-web.xml

Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 8.0 Servlet 2.4//EN"
   "http://www.sun.com/software/appserver/dtds/sun-web-app_2_4-0.dtd">
<sun-web-app>
  <context-root>/hello1_formauth</context-root>
   <security-role-mapping>
      <role-name>loginUser</role-name>
      <group-name>user</group-name>
  </security-role-mapping>
</sun-web-app>



Это сообщение отредактировал(а) rimidal - 21.7.2008, 14:59
PM MAIL   Вверх
jokodzuma
Дата 21.7.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а еще /logon.jsp покажите, пожалуйста
PM MAIL   Вверх
rimidal
Дата 21.7.2008, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



logon,jsp

Код

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
    <meta http-equiv=Cache-Control"" content="no-cache">
    <title>Login Page</title>
</head>
<% if(request.getUserPrincipal()!=null){ %>
   <h2>User is login.</h2>
   <h2>User name: <%= request.getUserPrincipal().getName() %></h2>
   <form method="get" action="logout.jsp">
     <input type="submit" value="Logout">    
   </form>
<%
   }
   else{
%>
<h2>Hello, please login: (123)</h2>
<br><br><form action='<%= response.encodeURL("j_security_check") %>' method=post>
<p><strong>Please Enter Your User Name: </strong>
<input type="text" name="j_username" size="25">
<p><p><strong>Please Enter Your Password: </strong>
<input type="password" size="15" name="j_password">
<p><p>
<input type="submit" value="Submit">
<input type="reset" value="Reset">
</form>
<% }%>
</html>


Тестировал в браузерах: FireFox 3.0, Internet Explorer 6.0
PM MAIL   Вверх
jokodzuma
Дата 21.7.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(rimidal @ 21.7.2008,  13:43)
Меня интересует почему сам j_security_check (это наверное какой-то стандартный сервлет) не доступен после авторизации сесcии?

да. это стандартный контекст в пункте J2EE.12.5.3.1 Login Form Notes спецификации 2.3 об этом сказано. этот контекст нельзя перехватывать и "слушать".

покажите еще
1. исходный код страницы, на которую попадаете после нажатия "назад"
2. "подробное" (где-то в настройках ИЕ включается) сообщение об ошибке

Добавлено через 9 минут и 9 секунд
кстати, обычно если пользователь хочет завершить сессию, то сознательно нажимает кнопку "логаут", а не авторизуется в рамках текущей сессии под новым логином. я, например, другого не встречал ни разу

Это сообщение отредактировал(а) jokodzuma - 21.7.2008, 17:11
PM MAIL   Вверх
rimidal
Дата 21.7.2008, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

1. исходный код страницы, на которую попадаете после нажатия "назад"


это /logon.jsp

Цитата

2. "подробное" (где-то в настройках ИЕ включается) сообщение об ошибке


это опция включена. Вот все что сервер отвечает:
Код

HTTP Status 404 -
type Status report
message
description The requested resource () is not available.
Sun Java System Application Server 9.1_02


Смотрел по логам самого сервера - все пусто.
Пытался отловить эту ошибку, через error page по эксепшену java.lang.Throwable - тоже пусто.
Только удалось перехватить код возврата 404 и все. Там пытался выводить возникшее исключение - пусто.

Цитата

да. это стандартный контекст в пункте J2EE.12.5.3.1 Login Form Notes спецификации 2.3 об этом сказано. этот контекст нельзя перехватывать и "слушать".

мне удается перехватывать фильтром обращение к URL http://localhost:8080/hello1_formauth/j_security_check

Цитата

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


Я полностью с этим согласен, но хочу как-то обрабатывать и описанный выше случай. Конечно он маловероятный, но возможный и может ввести пользователя в смятение. 
Как я писал выше такой баг наблюдается и в "админке" (http://localhost:4848/) самого GlassFish-а. Мелочь, а неприятно.

Это сообщение отредактировал(а) rimidal - 21.7.2008, 18:12
PM MAIL   Вверх
jokodzuma
Дата 21.7.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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