Mudar PATH de um projeto - Vraptor

18 respostas
frafael

Bom dia pessoal.

Tenho um projeto em vraptor e preciso deixar o PATH do projeto “dinâmico”. A url padrão de um projeto é : http://localhost:8080/meuprojeto/ . Mas várias empresas irão usar o projeto. Cada uma possui os seus usuários. Então tenho que separar as empresas pelo PATH. Quando o usuário digitar “/meuprojeto/nomedaempresa/login” ele irá para a página de login da empresa. E ao logar com essa empresa o PATH “/meuprojeto/nomedaempresa/” continue. Resumindo, preciso de um contexto após o “/meuprojeto/” que seja verificado no login e redirecione para a empresa desejado e quando o usuário logar, esse contexto continue. Estou a algum tempo procurando nos foruns, encontrei essa classe que o Lucas passou:

public class MeuRoutesParser extends PathAnnotationRoutesParser {    
	
    public MeuRoutesParser(Router router) {
		super(router);
	}
	
//delega o construtor
   protected void fixURIs(Class<?> type, String[] uris) {  
        for (int i = 0; i < uris.length; i++) {
            uris[i] = "/meucontexto"+ uris[i];
        }
   }
}

Mas ela só modifica o PATH quando levanto o Tomcat, não consigo modificar como projeto rodando.

Help.

18 Respostas

101574

O problema e que já compila o código antes de executar.
Você precisaria, enviar uma requisição para depois voltar a página.
Entende?

frafael

Provavelmente eu não consiga usar esta classe para fazer o que quero. Teria alguma maneira de fazer com que “/meuprojeto/nomedaempresa/” ficasse após o login? Eu já tentei usar o @Path("/{contexto}"), mas tenho que injetar no metódo o “contexto”, e isso é muito ruim.

101574

Tem poww!
E so vc redirecionar.

result.redirectTo(/nomedaempresa);

Aqui eu redireciono para meu controller Produtos

@Post("/login")
	public void login(Usuario usuario) {
	result.redirectTo(ProdutosController.class).lista();
	}

Era isso?

frafael

Amigo, não se trata de redirecionamento, se trata de uma uri fixa em todo projeto, com a empresa que venha do login.

Mas, desde já, agradeço a atenção.

frafael

Alguém?

101574

frafael:
Amigo, não se trata de redirecionamento, se trata de uma uri fixa em todo projeto, com a empresa que venha do login.

Mas, desde já, agradeço a atenção.


Voce pode fazer um if no seu controller.

frafael

Como assim?

frafael

Será que tem solução pra isso?

jweibe

Cara acho que isso se resolve com o mapeamento da tua URL nos seu métodos.

@Post("/{empresa}/login")  
    public void login(String empresa, Usuario usuario) {  
      result.redirectTo(ProdutosController.class).lista();  
    }

Dessa forma você joga a sua variável empresa na sessão do usuário é assim
você vai montando os link com essa variável na sessão.

href='/${empresa}/cadastro/cliente' Cadastro Cliente
frafael

Opa, obrigado pela resposta, na verdade eu já uso dessa maneira, tenho a empresa na sessão e eu coloco o @Path("{empresa}") em todas os controllers, e consequentemente em seus métodos. O problema é que eu tenho que colocar a variável empresa como parâmetro em todos os métodos das minhas classes controllers.

public void login(String empresa, Usuario usuario) { }

E como eu já disse, eu acho isso ruim. Se eu conseguisse mudar a uri seria ótimo. Não sei se isso é possível.

jweibe

frafael:
Opa, obrigado pela resposta, na verdade eu já uso dessa maneira, tenho a empresa na sessão e eu coloco o @Path("{empresa}") em todas os controllers, e consequentemente em seus métodos. O problema é que eu tenho que colocar a variável empresa como parâmetro em todos os métodos das minhas classes controllers.

public void login(String empresa, Usuario usuario) { }

E como eu já disse, eu acho isso ruim. Se eu conseguisse mudar a uri seria ótimo. Não sei se isso é possível.

Mais na verdade você não precisa colocar o parâmetro em todo método! Com certeza você tem um Interceptador pra validar o usuário certo?
Então é aqui que você tem que validar o usuário se ele esta no path da empresa correto.
Ex:
usuário: zezinho -> empresa: empresaX
usuário: joão-> empresa: empresaY

No Interceptador você valida isso se o usuário joão tentar acessar o path da empresaX você verifica que ele e da empresaY
e redireciona ele pro contexto correto.

frafael

Sim, sim. É verdade. Mas tem uma coisa que eu não gostei muito. Se acessar um método por exemplo:

@Post("/{empresa}/objetos")
	public void save( Objeto objeto ) {
		objetoDao.save(objeto );
		result.redirectTo(this).objetos();
	}

Nesse método eu salvo um objeto e redireciono para outro método:

@Get("/{empresa}/objetos")
	public void objetos() {
		result.include("objetos", objetoDao.list());
	}

Só que ao redirecionar para outro método usando “result.redirectTo(this).objetos();” eu perco a empresa.

jweibe

Mais eu acredito que ao fazer o redirecionamento

result.redirectTo(this).objetos();

Essa ação passará pelo Inteceptar e consequentemente você redirecionara pra a url com o nome da empresa corretamente,
uma vez que o atributa na sessão empresa só será inserido na url pra fazer uma “firula” (acredito eu, url personalizada).

frafael

Pelo interceptor que tenho, eu sempre perco. Teria como você me dar um exemplo?

Obrigado pela ajuda.

frafael

O que acontece é que no meu interceptor, eu redireciono para o método, e se eu quiser passar a empresa, eu tenho que passar como parâmetro.

O meu interceptor está assim:

public void intercept(InterceptorStack stack, ResourceMethod method, Object object) throws InterceptionException {
		boolean isUsuarioLogado = ( usuarioSession.getUsuario() != null );
		boolean isQuerAcessarLogin = method.getResource().getType().equals(LoginController.class);
		boolean acessoNegado = method.getMethod().getName().equals("negado");
		
		String url = request.getRequestURI().replaceFirst(request.getContextPath(), "");
		String contexto = url.replaceAll("(/)([a-zA-Z0-9]+)(/.+)?", "$2");
		
		if( !isUsuarioLogado && !isQuerAcessarLogin )
			result.redirectTo(LoginController.class).login(contexto);
		else {
			if (isUsuarioLogado){
				if (!contexto.equals(usuarioSession.getUsuario().getEmpresa().getContexto()) && !isQuerAcessarLogin && !acessoNegado) {
					result.redirectTo(LoginController.class).login(contexto);
				}
			}
			if( hasAcessoClasse(method) && hasAcessoMetodo(method) )
				stack.next(method, object);
			else result.redirectTo(IndexController.class).negado();
		}
	}
jweibe

Cara não deu pra fazer um exemplo aqui… to sem meu notebook!!
Mais ai deu certo? Funcionou tudo certinho?

frafael

No meu interceptor eu não consigo, coloquei ele na mensagem anterior.

C

Faça a implementação de Ajax nas suas páginas, acredito que terá o resultado desejado.

Criado 18 de setembro de 2012
Ultima resposta 4 de out. de 2012
Respostas 18
Participantes 4