[RESOLVIDO] É possivel fazer um redirecionamento de página com ajax no VRaptor

Vamos supor que faço uma requisição via ajax, e no controller que usar VRaptor redireciona para uma outra página, se eu fizer essa requisição via URL vai funcionar, ele vai redirecionar para outra página e tudo certo, só que no caso de via AJAX não rola, então só rola pra obter dados, ou tem alguma forma de configurar isso??

Obrigado desde já!

Boa noite.
Não entendi direito…

Você quer redirecionar (atualizar) a página inteira? Para isso, você pode retornar um
Ou você quer pegar um retorno do Ajax que tem um redirect no meio? Se for isso, o Ajax já segue os redirecionamentos… acho que desde que esteja no mesmo domínio.

Espero ter ajudado.

No caso por exemplo eu uso VRaptor, dae tenho um controller que possui um método chamado consulta, ou seja, quando eu chamar esse método consulta por padrão o VRaptor vai me redirecionar para página consulta.jsp, se eu chamar esse método via url vai funcionar de boa, ele vai achar a página e tudo, mas se eu chamar via ajax ele não faz nada, nem redireciona para a página consulta.jsp, dae não sei se tem que fazer alguma configuração a mais no ajax ou coisa do genero, deu pra entender o problema?

algum motivo forte pra isso ser uma requisição ajax? pq não uma normal?

bem, no caso estou fazendo uma tela de login, dae vamos supor eu mando uma autenticação via ajax, e caso não fosse aunteticado, me retornaria uma resposta em forma de json, e mostraria alguma alerta pro cara com alguma mensagem ou coisa do genero, conforme a mensagem que vier dentro do resultado obtido com ajax, caso contrário me redireciona-se para um página conforme a regra dentro do controller, mas no caso, quero que o próprio controller redirecione… é possível fazer isso? ou existem uma forma melhor de fazer isso?

o que vc pode fazer é o controller retornar a url pra onde vc tem que ir

ou fazer em duas requests: uma ajax que verifica se o usuário é ok, e outra que faz a request normal

blz, vou fazer com que o controller retorne a URL, obrigado pela atenção :smiley:

Estou com uma dúvida nisso tmb, mas meu caso é um pouco diferente.

Eu tenho uma requisição ajax normal, que vai substituir o conteúdo de uma DIV:

$.ajax({
		url: path,
		data: params,
		dataType: 'html',
		success: function(data, textStatus, jqXHR){
			$('#div').replaceWith(data);
		}
	});

Porém, um interceptor de autorização fez um redirect, pois a sessao do usuário ja tinha expirado por exemplo:

result.redirectTo(UsuariosController.class).loginForm();

Como eu faço para saber dentro do $.ajax que eu preciso redirecionar para a pagina que o interceptor mandou?

se eu não me engano, vc pode usar o complete e ver se o status for 301 (redirect) daí vc pega a location e redireciona a página.

algo como:

complete: function(xhr) {
   if (xhr.status == 301) {
        //redireciona pra url que tá no header Location
   }
}

Lucas, eu estava tentando isso ai mesmo mas o problema é que nessa requisição

$.ajax({
		url: path,
		data: params,
		dataType: 'html',
		success: function(data, textStatus, jqXHR){
				$('#divReplace').replaceWith(data);
		},
		complete: function(xhr) {
			alert(xhr.status);
		}
	});

O alert ali do complete: é exibido com status 200.

Estou testando com um controller normal e não com o Interceptor como eu disse
Mas o código do controller é esse (a requisição é feita para o TesteController.exec que redireciona para LoginController.login:

@Resource
public class LoginController {
	
	private final Result result;

	public LoginController(Result result) {
		this.result = result;
	}
	
	@Get("/")
	public void login() {}
}
@Resource
public class TesteController {
	public void exec() {
		result.redirectTo(LoginController.class).login();
	}
}

tenta trocar o complete por statusCode então:

statusCode: {
    302: function() {
          //sssss
    },
    301: function() {
          //sssss
    },
}

e veja se passa por aí

Nada Lucas, estou pensando em adicionar um parâmetro no retorno (quando JSON e um qunado HTML pra fazer isso) ou então adicionar um Header sei la.

o método ajax ficou assim

$.ajax({
		url: path,
		data: params,
		dataType: 'html',
		statusCode: {
		    302: function() {
		    	alert('Status code Retornado: 302');
		    },
		    301: function() {
		    	alert('Status code Retornado: 301');
		    },
		    200: function() {
		    	alert('Status code Retornado: 200');
		    }
		},
		success: function(data, textStatus, jqXHR){
			$('#divRep').replaceWith(data);
		},
		complete: function(xhr) {
			alert(xhr.status);
		}
	});

tentei tirando o método complete: mas tmb não funcionou ele exibe direto o alert do método statusCode: “Status code Retornado: 200”, ou seja parece que está retornando 200 mesmo do servidor.

deve ser pq o jquery já faz os redirects automaticamente…

o que eu faço geralmente no meu sistema é ver se a requisição é ajax (tem um header http chamado X-Requested-With ou algo do tipo que se setado é pq é ajax), e ao invés de redirecionar eu retorno o status code 401 (Unauthorized), assim eu consigo tratar no javascript mais fácil, até genericamente, pra qualquer requisição ajax do sistema.

é o Jquery já faz a requisição mesmo:
veja o log do Vraptor
16:24:15,017 DEBUG [VRaptor ] VRaptor ended the request
Começou de novo na mesma requisição.
16:24:15,022 DEBUG [VRaptor ] VRaptor received a new request

Lucas como retornar um status code com o VRaptor?

vc pode usar:

result.use(Results.status()).algumDosStatusAqui();
//ou
result.use(Results.http()).sendError(401);

Valeu Lucas, vou fazer com o status 401,

andei pesquisando rapidamente aqui e não tem jeito mesmo. Não é o JQuery que refaz automaticamente a nova requisição é o próprio browser que recebe 301 e já refaz antes de voltar ao JQuery.