JSF + Sessao

8 respostas
overkill

Senhores … estou estudando JSF fiz uma aplicaçãozinha simples que efetua o login por jsf e criei um filtro para tal conmtrole da aplicação onde verifico por por /sistema/* se o cara ta logado … tudo funciona valida login e tudo … e gravo o beans a nivel de sessao … mas quando faço logout … se o cara clicar no botao voltar do browser e dar um F5 ele loga novamente pois ele reenvia as informações de login … alguem sabe como fugir disso ??

abraço a todos

8 Respostas

Anderson_Schmidt

Olá,

Quando o usuário sai do sistema, vc invalida a sessão?

Flws!

overkill

sim amigo uso o metodo “invalidade()”.

mas o problema e o botao voltar mesmo … muito estranho ou falta de esperiencia minha mesmo hehe.

Abraço

W

Coloca o código ai!

overkill

cara o lance é so no filtro mesmo !

mas ao meio dia posto ai o esquema do filtro que to usando pois nao tenho aqui .

humberto.lima

Pelo que entendi o seu problema já é conhecido pela comunidade. Ainda bem né? Ainda bem, porque já existe uma solução para isso, chama-se Synchronized Token Pattern, a ideia é criar na sessao do usuário um token, e mandar para a pagina de login o token, na primeira vez q ele fizer login o token ta igual ao da sessão, ai tudo bem(lembrar de mudar o token da sessão), na segunda vez o token da sessão vai estar diferente do token da pagina ja que a pagina nao foi carregada do servidor.

Acho q fui claro, mas qualquer coisa pergunta ai…

falow.

Humberto Lima

humberto.lima

como é q remove uma mensagem?

Humberto Lima

overkill

HUmmm cara … nao ficou claro não … eu faço a validação no bean … e registro a sessao …

mas nao ficou claro nao desculpe mas sou iniciante como vc mesmo pode ter percebido … estou abandonado o PHP e estou motivado a fazer isso gostei do JSF mas estou apanhando em pegar as teorias … mas estou indo … hehehe

agradeço se puder ajudar … exemplos documentação anexa qualquer coisa relacionada ao assunto … abraço !

humberto.lima

Infelizmente não encontrei uma implementação para jsf. Segue um exemplo com struts

public final ActionForward perform(ActionMapping mapping,
        ActionForm form,
        HttpServletRequest request,
        HttpServletResponse response)
    throws IOException, ServletException {
    HttpSession session = request.getSession();
    ActionForward forward = null;
    if (isTokenValid(request)) {
        // Reset token and session attributes
        reset(request);
        try {
            // Perform the action and store the results
            forward = performSynchro(mapping, form, request, response);
            session.setAttribute(FORM_KEY, form);
            session.setAttribute(FORWARD_KEY, forward);
            ActionErrors errors = (ActionErrors) 
                        request.getAttribute(Action.ERROR_KEY);
            if (errors != null && !errors.empty()) {
                saveToken(request);
            }
            session.setAttribute(ERRORS_KEY, errors);
            session.setAttribute(COMPLETE_KEY, "true");
        } catch (IOException e) {
            // Store and rethrow the exception
            session.setAttribute(EXCEPTION_KEY, e);
            session.setAttribute(COMPLETE_KEY, "true");
            throw e;
        } catch (ServletException e) {
            // Store and rethrow the exception
            session.setAttribute(EXCEPTION_KEY, e);
            session.setAttribute(COMPLETE_KEY, "true");
            throw e;
        }
    } else {
        // If the action is complete
        if ("true".equals(session.getAttribute(COMPLETE_KEY))) {
            // Obtain the exception from the session
            Exception e = (Exception) session.getAttribute(EXCEPTION_KEY);
            // If it is not null, throw it
            if (e != null) {
                if (e instanceof IOException) {
                    throw (IOException) e;
                } else if (e instanceof ServletException) {
                    throw (ServletException) e;
                }
            }
            // Obtain the form from the session
            ActionForm f = (ActionForm) session.getAttribute(FORM_KEY);
            // Set it in the appropriate context
            if ("request".equals(mapping.getScope())) {
                request.setAttribute(mapping.getAttribute(), f);
            } else {
                session.setAttribute(mapping.getAttribute(), f);
            }
            // Obtain and save the errors from the session
            saveErrors(request, (ActionErrors)
                    session.getAttribute(ERRORS_KEY));
            // Obtain the forward from the session
            forward = (ActionForward) session.getAttribute(FORWARD_KEY);
        } else {
            // Perform the appropriate action in case of token error
            forward = performInvalidToken(mapping, form, request, response);
        }
    }
    return forward;
}

No jsf vc pode colocar no Bean um atributo “token” e deixar na sessão(FacesContext.getCurrentInstance().getExternalContext().getSession()) outro.

A sequencia seria mais ou menos essa:

1 - Ao entrar na pagina de login o atributo token da sessao é inicializado;

2 - Ao montar a pagina de login o atributo token é passado como um inputHidden, acho q pode ficar na declaração do faces-config(ver $sessionScope.token);

3 - Quando o usuário submeter o formulario, vc vai pegar o token da sessao e comparar com o toke do bean. Se forem iguais vc pode continuar a validação.

[]´s

Humberto Lima

Criado 3 de setembro de 2007
Ultima resposta 6 de set. de 2007
Respostas 8
Participantes 4