Gastaldi's Blog

Mais um blog sobre Java …

Filtro para sessão expirada

Se você programa em Java EE para aplicações Web, já deve ter conhecimento do objeto HttpSession e a sua expiração por inatividade. Neste post apresento um exemplo de um filtro que permite detectar no momento da requisição se a sessão expirou e assim evitar erros como Session already invalidated e afins:

package com.george.utils;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Filtro para controle de expiração da sessão.
 * 
 * Caso a sessão seja expirada, redireciona para uma URL definida
 * 
 * @author George Gastaldi
 * 
 */
public class SessionExpiredFilter implements Filter {

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig filterConfig) throws ServletException {
	}

	/**
	 * Verifica se a sessão não expirou, caso contrário joga erro 408 (REQUEST TIMEOUT).
	 */
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest httpRequest = (HttpServletRequest) request;
		HttpServletResponse httpResponse = (HttpServletResponse) response;

		// Verifica se existe uma sessão para comparar e se a session ID
		// retornada pelo cliente é a mesma
		boolean sessionInvalidated = isSessionInvalidated(httpRequest);
		if (sessionInvalidated) {
			httpResponse.addCookie(createCookie(httpRequest));
			httpResponse.sendError(HttpServletResponse.SC_REQUEST_TIMEOUT);
		} else {
			chain.doFilter(request, response);
		}
	}
	
	/**
	 * Retorna se a sessão foi invalidada
	 * @param httpRequest
	 * @return
	 */
	boolean isSessionInvalidated(HttpServletRequest httpRequest) {
		String requestedSessionId = httpRequest.getRequestedSessionId();
		HttpSession session = httpRequest.getSession(false);	
		if (session == null) {
			return (requestedSessionId != null);
		} else {
			return (requestedSessionId != null && !session.getId().equals(requestedSessionId));
		}
	}
	
	/**
	 * Mata o cookie de sessão do browser
	 * @param request
	 * @return
	 */
	private Cookie createCookie(HttpServletRequest request) {
		Cookie cookie = new Cookie("JSESSIONID", request.getRequestedSessionId());
		cookie.setMaxAge(0); // Matar o cookie
		String contextPath = request.getContextPath();
		if (!"".equals(contextPath)) {
			cookie.setPath(contextPath);
		} else {
			cookie.setPath("/");
		}
		return cookie;
	}


	/**
	 * @see Filter#destroy() 
	 */
	public void destroy() {
	}

}

Você pode configurar no seu web.xml o filtro da seguinte maneira:

<filter>
	<filter-name>Session Expired Filter</filter-name>
	<description>Filtro para sessões expiradas. Lança erro 408 se a sessão expirou</description>
	<filter-class>com.george.utils.SessionExpiredFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>Session Expired Filter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

Anúncios

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: