[Resolvido] Redirecionar para login apos timeout + vraptor

13 respostas
david.cs20

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.

13 Respostas

Rafael_Guerreiro

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

david.cs20
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".
@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());
	}

}
Tava pensando em fazer algo do tipo:
if (userSession.getUser() != null){
				System.out.println("logado !");
			
			}else{
				result.include("message", "Sessão expirada! Favor efetuar login novamente.");
				result.redirectTo(UsuariosController.class).loginForm();
			}
Rafael_Guerreiro

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

david.cs20

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)

Rafael_Guerreiro

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

Lucas_Cavalcanti

mto provavelmente isso: userSession.getUser()

david.cs20

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

Rafael_Guerreiro

É 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.

david.cs20

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.

Lucas_Cavalcanti
if (x != null) {
    x.algumaCoisa()
}
david.cs20

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

Lucas_Cavalcanti

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());  
    }
david.cs20

Era isso mesmo lucas muito obrigado !

Criado 18 de junho de 2012
Ultima resposta 19 de jun. de 2012
Respostas 13
Participantes 3