Struts 2 - Login + Sessão

5 respostas
fabio.nascimento

Estou tendo problemas no Struts 2 com login usuario em minha aplicação, ao setá-lo na sessão.

Primeiramente foi criado um Inteceptor que valida o usuário e o coloca na sessao.

Toda chamada de aciton deve passar por este interceptor verificando o usuario na sessao e caso o usuario nao esteja logado envia para uma tela de login.

O problema é que estou perdendo a sessao no momento da navegacao entre as paginas.

Para resolver este problema optou-se por configurar o tomcat para que este fizesse url rewriting colocando o jsessionid diretamente na url.

Com isso caímos em outro problema:

[list]Quando acesso uma pagina e abro outra janela do browser para acessar esta mesma URL, essa porém não passa pelo interceptor, neste caso o browser do cliente está armazenando paginas e sessões em cache? . Com isso a proxima navegacao na aplicacao o interceptor nao acha o usuario na sessao, caindo sempre na pagina de login.[/list]

Alguém saberia me dizer se existe outra maneira de implementar login de usuario na sessao com struts 2 e tomcat 5.5 ?

Grato.

5 Respostas

idev4web

Voce tem duas maneiras de trabalhar com sessao no struts2.

Voce pode usar HttpSession ou voce pode usar a sessao do struts2

  1. Trabalhar com um objeto HttpSession
public class SuaAction extends ActionSupport implements ServletRequestAware {
       private HttpServletRequest request;

       @Override
        public void setServletRequest(HttpServletRequest arg0) {
	request = arg0;
        }

         public String execute() throws Exception {
                request.getSession().getAttribute("nome_objeto")
         }

2.Trabalhar com objetos da sessao do struts2. Struts2 (sessao)

Map sessao = ActionContext.getContext().getSession();

sessao.put("pos", new Integer(1));

Objeto o= (Objeto) ActionContext.getContext().getSession().get("nome_do_objeto_na_sessao");
fabio.nascimento

Caro idev4web, já estamos codificando dessa forma como pode perceber em nosso código abaixo:

private void getCodCia(ActionInvocation invocation, List<String> errors) throws Exception {
		// Recupero o objeto request
		HttpServletRequest request = (HttpServletRequest)invocation.getInvocationContext().get(HTTP_REQUEST);
		// Recupero a sessão
		HttpSession session = request.getSession();
		try{
			// Recuperando o código da companhia da sessão
			String codCia = (String) session.getAttribute(GeralConstants.COMPANHIA_REQUEST);
			// Caso a companhia não tenha cido encontrada na sessão, tentar recuperar no request.
			if (codCia == null) {
				codCia = request.getParameter(GeralConstants.COMPANHIA_REQUEST);
				// Caso a companhia não tenha cido encontrada, atribuir erro. 
				if((codCia == null)&&("".equals(codCia))) {
					session.removeAttribute(GeralConstants.COMPANHIA_REQUEST);
errors.add((String)ResourcesUtils.getMessage(invocation.getInvocationContext().getLocale(),INTERCEPTOR_BUNDLE, ERROR_CIA));
				} else {
					// Caso a companhia tenha cido encontrada, setar na sessão.
					session.setAttribute(GeralConstants.COMPANHIA_REQUEST, codCia );
				}
			} 
		}catch(Exception e){
			try {
				// Caso ocorra algum erro o limpar a sessão.
				session.removeAttribute(GeralConstants.COMPANHIA_REQUEST);				
				errors.add((String)ResourcesUtils.getMessage(invocation.getInvocationContext().getLocale(),INTERCEPTOR_BUNDLE, ERROR_CIA));
			} catch (Exception erro){
                throw erro;				
			}
		}		
	}

Na verdade o que necessitamos saber é se existe hoje uma outra forma de se trabalhar com sessão ou até mesmo uma forma de contornar o problema encontrado.

Mais uma vez.

Grato.

idev4web

Eu estava editando a msg. verifique a primeira msg que eu postei

fabio.nascimento

Tentando explicar melhor nosso problema:

Desenvolvemos um interceptor que dentre outras coisas está sendo utilizado para login no sistema onde na primeira chamada a qualquer pagina da minha aplicação são realizadas as verificacoes e setado o usuario logado na sessao, conforme deveria realmente trabalhar o interceptor.

Bom…

Quando é feita uma chamada a qualquer action, o interceptor verifica se o usuario está logado e caso não esteja redireciona o usuario para tela de login.

Tal problema ocorre somente em alguns clientes, onde depois que o usuario ja acessou a pagina desejada mais que uma vez, o browser armazena esta pagina em cache. Com isso, não é chamado o interceptor e o usuario não é setado na sessao.

Após isso, qualquer outra operação acionada pelo usuario, ações essas que recuperam informações no BD, automaticamente o usuário é redirecionado para a tela de login, deixando claro que a sessão está morrendo.

Existe alguma forma de contornar este problema de cache no browser do cliente para que nao ocorra este problema? Ou ainda , uma outra maneira de implementar login de usuario no struts 2?

Abraços.

fabio.nascimento

Criado 8 de maio de 2008
Ultima resposta 9 de mai. de 2008
Respostas 5
Participantes 2