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


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

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

Возможно ли сделать так чтобы повторная авторизация была возможна (чтоб сервер сам завершал предыдущую сессию и открывал новую)? 

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

Автор: 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.

Автор: jokodzuma 21.7.2008, 14:31
Цитата(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. Что в строке отображается в строке адреса после нажатия кнопки "назад"? Какой браузер, какой версии?

Автор: rimidal 21.7.2008, 14:55
Сервер: 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>


Автор: jokodzuma 21.7.2008, 15:34
а еще /logon.jsp покажите, пожалуйста

Автор: rimidal 21.7.2008, 15:44
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

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

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

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

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

Автор: rimidal 21.7.2008, 18:07
Цитата

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-а. Мелочь, а неприятно.

Автор: jokodzuma 21.7.2008, 18:31
попробуйте http://forums.sun.com/thread.jspa?threadID=353797&messageID=1954596 (или http://objectmix.com/weblogic/560106-form-based-authentication-problem-weblogic.html) как частный случай http://www.google.ru/search?aq=f&complete=1&hl=ru&newwindow=1&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&hs=Bic&q=%2Bj_security_check+%2Bback&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=

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