Segurança Tomcat - Invalid direct reference to form login page

Ola GUJMANIACOS…

Antes de mais nada, este link: http://guj.com.br/posts/list/30706.java#677518 EU JA VI…hehe

mas nao me ajudou, infelizmente ngm terminou de falar sobre…estive lendo meu xml mas nao vi erro…c alguem puder me ajudar eu agradeceria mtissimo…

consigo logar em minha aplicacao e fazer todas as restrições necessarias aos users, mas qdo deslogo e tento logar novamente com o mesmo user ou até com outro user da o seguinte erro postado abaixo…percebi que qdo a sessao expira eu consigo tranquilamente fazer o logout e o logon novamente com qualquer usuario…mas enquanto nao expira eu nao consigo…

Uma parte de meu xml:

<session-config>
        <session-timeout>1</session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>/restrito/geral/home.jsp</welcome-file>
    </welcome-file-list>
    <error-page>
        <error-code>403</error-code>
        <location>/paginasErro/acessoNegado.jsp</location>
    </error-page>
    <security-constraint>
        <display-name>Funcionalidades Gerais</display-name>
        <web-resource-collection>
            <web-resource-name>Funcionalidades Gerais</web-resource-name>
            <description>Logados no sistema podem acessar essas paginas</description>
            <url-pattern>/restrito/geral/*</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>
            <description>Usuários que podem acessar o sistema</description>
            <role-name>administrador</role-name>
            <role-name>programador</role-name>
            <role-name>designer</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>
        <display-name>Funcionalidades Administração</display-name>
        <web-resource-collection>
            <web-resource-name>admins</web-resource-name>
            <description>Apenas administração</description>
            <url-pattern>/restrito/admins/*</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>
            <description>Administração</description>
            <role-name>administrador</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>
        <display-name>Funcionalidades Programação</display-name>
        <web-resource-collection>
            <web-resource-name>prog</web-resource-name>
            <description>Apenas programação</description>
            <url-pattern>/restrito/prog/*</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>
            <description>Programadores</description>
            <role-name>programador</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>FORM</auth-method>
        <realm-name/>
        <form-login-config>
            <form-login-page>/login.jsp</form-login-page>
            <form-error-page>/paginasErro/loginSenhaInvalidos.jsp</form-error-page>
        </form-login-config>
    </login-config>
    <security-role>
        <description>Administração</description>
        <role-name>administrador</role-name>
    </security-role>
    <security-role>
        <description>Programação</description>
        <role-name>programador</role-name>
    </security-role>
    <security-role>
        <description>Web</description>
        <role-name>designer</role-name>
    </security-role>

[color=red]Minha arvore de projeto esta em anexo[/color]

[color=brown]Este é o ERRO:

HTTP Status 400 - Invalid direct reference to form login page

type Status report

message Invalid direct reference to form login page

description The request sent by the client was syntactically incorrect (Invalid direct reference to form login page).
Apache Tomcat/6.0.18
[/color]
Agradeço a ajuda de todos.

Abraxxx e fikem com DEUS…

O que você faz quando você “desloga”? Você também destrói a sessão invalidando ela?

Inté.

Ola KWill,

Sim:

[code]public class LogoutServlet extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    HttpSession sessao = request.getSession();
    sessao.invalidate();
    RequestDispatcher rd = request.getRequestDispatcher("/login.jsp");
    rd.forward(request, response);
}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/** Handles the HTTP <code>GET</code> method.
 * @param request servlet request
 * @param response servlet response
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    processRequest(request, response);
}

/** Handles the HTTP <code>POST</code> method.
 * @param request servlet request
 * @param response servlet response
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    processRequest(request, response);
}

/** Returns a short description of the servlet.
 */
public String getServletInfo() {
    return "Short description";
}
// </editor-fold>

}[/code]

Obrigado mais um vez…

fike com DEUS!

Mas pelo que eu to vendo isso aí gera um HTTP Forward, sendo que o que seria necessário é um HTTP Redirect, senão o browser não vai gerar uma requisição nova, o que vai acabar num erro já que a sessão acabou de morrer e o servidor ficará confuso já que esse “Forward” tentou acessar uma página usando as referências de uma sessão inexistente.
Em vez do “Forward”, ponha um “Redirect” via “response.sendRedirect()”.

Inté.

Vlw brother…

mas infelizmente nao funcionou tbm… :cry:

tem outra carta na manga aih cara…fala que simmmmm…hehehehehehe… :lol: :smiley:

Abrax e obrigado novamente…

Tem o lendário truque do redirecionamento extra ultra-neurótico via javascript, que até altera a barra de endereço no browser, na página de login, deve haver algo do tipo:

[...]
function redireciona()
{
	if (!window.location.href.match("&lt;%=request.getContextPath()%&gt;/login.jsp"))
	{
		window.location.href = "&lt;%=request.getContextPath()%&gt;/login.jsp";
	}
}
[...]
&lt;body onload="redireciona()"&gt;
[...]

Editado: Errei, sem a checagem numa função javascript o browser entra em loop infinito.

Inté.

opa…

mas isto que vc esta me passando é para que eu va para a tela de login correto???

mas o meu problema é outro…

eh q eu nao consigo entrar na aplicacao depois que eu ja entrei uma vez e dei logout, até a sessao expirar…

obrigado pela ajuda!

Abraxxx…

Fika com DEUS…

Acho que o problema seria outro então, já que depois que você destrói a sessão no lado servidor e redireciona via HTTP redirect para a página de login, o servidor web deve criar uma outra sessão sozinho para você quando o browser faz outra requisição por páginas. To começando a achar que tu não tá fazendo deployment correto das alterações. Quando tu manda um “response.sendRedirect()”, acontece o que?

Inté.

e aih brother…

qdo eu mando o response.sendredirect() ele manda para a pagina de login.jsp certinho…

aih eu tento logar denovo e da o erro de [color=red]invalid direct reference to form login page[/color]…

mas c eu espero dar o tempo da sessao terminar antes de deslogar da minha aplicacao ele loga…

o que eu deveria fazer para que o deployment seja feito corretamente?? Eu apenas paro a aplicacao, desimplanto, paro o tomcat, inicio ele novamente e implanto a aplicacao…

ta errado???

vlw brother…

abraxxxxx e fica com DEUS…

[quote=ramaciotti]e aih brother…

qdo eu mando o response.sendredirect() ele manda para a pagina de login.jsp certinho…

aih eu tento logar denovo e da o erro de [color=red]invalid direct reference to form login page[/color]…

mas c eu espero dar o tempo da sessao terminar antes de deslogar da minha aplicacao ele loga…

o que eu deveria fazer para que o deployment seja feito corretamente?? Eu apenas paro a aplicacao, desimplanto, paro o tomcat, inicio ele novamente e implanto a aplicacao…

ta errado???

vlw brother…

abraxxxxx e fica com DEUS…[/quote]
Eu recomendo também destruir totalmente o conteúdo da pasta “work” do Tomcat, para garantir que o maldito vai recompilar tudo para mim novamente. Deixe-me ver como ficou esse tal servlet de logout com usando “redirect”.

Inté.

Fala brother…

[code]package loginTomcat.controller;

import java.io.*;

import javax.servlet.;
import javax.servlet.http.
;

public class LogoutServlet extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    HttpSession sessao = request.getSession();
    sessao.invalidate();
    response.sendRedirect("login.jsp");
    //Nao se pode fazer um request dispatcher pois estou enviando dados
    //de uma função inexistente ao browser, aih ele fika doidao!!!

// RequestDispatcher rd = request.getRequestDispatcher("/login.jsp");
// rd.forward(request, response);
}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/** Handles the HTTP <code>GET</code> method.
 * @param request servlet request
 * @param response servlet response
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    processRequest(request, response);
}

/** Handles the HTTP <code>POST</code> method.
 * @param request servlet request
 * @param response servlet response
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    processRequest(request, response);
}

/** Returns a short description of the servlet.
 */
public String getServletInfo() {
    return "Short description";
}
// </editor-fold>

}[/code]

Taí brother…

vlw pela dica, mas nao deu certo tbm não fera…:frowning:

Abraxx…

Fica com DEUS.

Lembrando agora, nunca invalidei sessões usando servlets apenas, eu sempre fazia isso num scriptlet duma página JSP, talvez por isso sempre funcionou. No seu caso, pode ser que antes de enviar o “redirect” você precise criar na mão uma nova sessão, via “request.getSession(true)”, mas isso depois de invalidar a sessão, que em teoria cria uma nova sessão para você.

Inté.