[Resolvido] Redirecionar para login apos timeout + vraptor

Ola !
Tenho um timeout configurado na minha aplicação porem gostaria de apos esse timeout o usuário fosse redirecionado para a tela de login e não para a pagina de error.

É só no seu interceptor que verifica se ele está logado e pode acessar determinada action você redirecionar para a página de login.

Ja tinha mais ou menos em mente.
Mais tenho que criar um interception novo para isso ou posso usar o que tenho para “controlar acesso”.

[code]@Intercepts
public class PermissionInterceptor implements Interceptor {

private final Result result;
private final UsuarioWeb userSession;


public PermissionInterceptor(Result result, UsuarioWeb userSession) {
	this.result = result;
	this.userSession = userSession;
}

public boolean accepts(ResourceMethod method) {
	return !(method.getMethod().isAnnotationPresent(Public.class) || method.getResource().getType().isAnnotationPresent(Public.class));
}

public void intercept(InterceptorStack stack, ResourceMethod method, Object resource) {
	Permission methodPermission = method.getMethod().getAnnotation(Permission.class);
	Permission controllerPermission = method.getResource().getType().getAnnotation(Permission.class);
	
	if (this.hasAccess(methodPermission) && this.hasAccess(controllerPermission)) {
		stack.next(method, resource);
	}else {
		result.forwardTo("/WEB-INF/jsp/erros/403.html");
	}
}

private boolean hasAccess(Permission permission) {
	if (permission == null) {
		return true;
	}
	Collection<PerfilUsuario> perfilList = Arrays.asList(permission.value());
	return perfilList.contains(userSession.getUser().getPerfil());
}

}[/code]

Tava pensando em fazer algo do tipo:[code]
if (userSession.getUser() != null){
System.out.println(“logado !”);

		}else{
			result.include("message", "Sessão expirada! Favor efetuar login novamente.");
			result.redirectTo(UsuariosController.class).loginForm();
		}[/code]

Ao invés de fazer isso: result.forwardTo("/WEB-INF/jsp/erros/403.html"); Faça o redirect para a página inicial.

So que ai da erro 500:

18/06/2012 17:55:47 org.apache.catalina.core.StandardWrapperValve invoke GRAVE: Servlet.service() for servlet [default] in context with path [/futura] threw exception java.lang.NullPointerException at ws.futuranet.interceptor.PermissionInterceptor.hasAccess(PermissionInterceptor.java:63) at ws.futuranet.interceptor.PermissionInterceptor.intercept(PermissionInterceptor.java:50) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:48) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662)

Cara, NullPointerException é (quase) sempre erro do desenvolvedor. Debuga para descobrir o que está ficando nulo e trata esse caso.

mto provavelmente isso: userSession.getUser()

Não consegui entender lucas.
O userSession.getUser() fica nullo depois do timeout.

É por que quando faz o timeout, ele tira os objetos da sessão (setando eles com null)
Então, quando o seu userSession estiver null, é porque o usuário não está conectado.

Eu entendi que quando o userSession estiver null e pq não tem usuário. E isso vai ocorrer apos o timeout.
O que eu não entendi e como vou trata-lo sendo que depois de cada timeout ele vai esta null.

if (x != null) {
    x.algumaCoisa()
}

lucas se vc ver na minha segunda resposta desse post
Ja tinha sugerido essa solução porem testei aqui e continuo com o mesmo problema

se vc testou pra nulo e ainda tá dando nullpointer vc testou no lugar errado :wink:
tenta assim:

private boolean hasAccess(Permission permission) {  
        if (permission == null) {  
            return true;  
        }
        if (userSession.getUser() == null) {
             return false;
        }  
        Collection<PerfilUsuario> perfilList = Arrays.asList(permission.value());  
        return perfilList.contains(userSession.getUser().getPerfil());  
    }  

Era isso mesmo lucas muito obrigado !