Vraptor3: IllegalStateException ao redirecionar após um HttpSession.invalidate. [resolvido]

Após efetuar um session.invalidate na http-session do usuário, recebo um IllegalStateException.

SEVERE: StandardWrapperValve[default]: PWC1406: Servlet.service() for servlet default threw exception br.com.caelum.vraptor.InterceptionException: java.lang.IllegalStateException: PWC2789: setAttribute: Session already invalidated at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:76) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:83) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45) [...] at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) at com.sun.enterprise.web.connector.grizzly.ssl.SSLReadTask.process(SSLReadTask.java:440) at com.sun.enterprise.web.connector.grizzly.ssl.SSLReadTask.doTask(SSLReadTask.java:228) at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106) Caused by: java.lang.IllegalStateException: PWC2789: setAttribute: Session already invalidated at org.apache.catalina.session.StandardSession.setAttribute(StandardSession.java:1633) at org.apache.catalina.session.StandardSessionFacade.setAttribute(StandardSessionFacade.java:179) at br.com.caelum.vraptor.interceptor.FlashInterceptor$1.beforeRedirect(FlashInterceptor.java:48) at br.com.caelum.vraptor.http.VRaptorResponse.sendRedirect(VRaptorResponse.java:27) at br.com.caelum.vraptor.view.DefaultPageResult.redirect(DefaultPageResult.java:86)

Analisando o código achei:

response.addRedirectListener(new RedirectListener() { public void beforeRedirect() { session.setAttribute(FLASH_INCLUDED_PARAMETERS, result.included()); } });

No meu caso, como eu invalido a http-session, esse método está tentando adicionar elementos dentro da sessão, porém a mesma está “morta”, e segundo a documentação, uma exception é lançada. Esse método pode ser alterado para fazer um catch ou eu estou fazendo algo errado?

response.addRedirectListener(new RedirectListener() { public void beforeRedirect() { try { session.setAttribute(FLASH_INCLUDED_PARAMETERS, result.included()); } catch(IllegalStateException e) { // ignore this exception } } });

é melhor alterar para

session = request.getSession(false);

if (session != null) …

Nossa, que vacilo =S

vou corrigir isso… por enquanto você pode criar uma classe:

@Component
public class MeuFlashInterceptor extends FlashInterceptor {
     //coloca esse código novo no método intercepts
}

[quote=Lavieri]é melhor alterar para

session = request.getSession(false);

if (session != null) …[/quote]

Segundo a especificação você está certo. Porém na teoria… fazendo um request.getSession(false) está me retornando uma http-session válida. Fazendo um inspector nela tenho isValid = false e isNew = false.

Fiz por enquanto um try and catch;

já está corrigido no source (com o try-catch)

Baixado, compilado, e funcionando.

Tkx guy :thumbup:

Lucas, eu estive analisando essa correção:

try { session.setAttribute(FLASH_INCLUDED_PARAMETERS, result.included()); } catch (IllegalStateException e) { LOGGER.warn("HTTP Session was invalidated. It is not possible to include Result parameters on Flash Scope", e); }

É realmente necessário fazer logging da exception? Toda vez que alguém faz logout na minha aplicação acabo tendo esse log.

Uma outra coisa a fazer é verificar se realmente há atributos a colocar no flash. No meu caso como é um logout, meu Result.included() retorna um Map vazio.

try { if (!result.included().isEmpty()) { session.setAttribute(FLASH_INCLUDED_PARAMETERS, result.included()); } } catch (IllegalStateException e) { LOGGER.warn("HTTP Session was invalidated. It is not possible to include Result parameters on Flash Scope", e); }

faz todo o sentido, garcia…

já mudei no source e commitei…

você conhece git? nesses casos você pode abrir um fork, e fazer essas modificações e mandar
pra gente! assim seu nome fica lá como autor da modificação =)

[]'s

Lucas, vou dar uma olhada nisso. Esses dias criei um fork, mas acabei me perdendo, hehehe. Para quem a vida toda usou CVS e SVN é normal no inicio se perder, hehehe.

Vou fazer um fork então e qualquer coisa te aviso.

Abraços, e obrigado.