[Resolvido] URL em menus - primefaces

E ae galera,

Estou criando um menu dinâmico em meu projeto.
No momento de montar o menu eu dou um setUrl. Ele monta o menu tudo certinho.

O problema é que quando eu clico a primeira vez no menuItem, ele chama a URL correta isso porque estou na raiz de minha aplicação.
Agora quando eu clico em um outro menuItem, ele mantem a URL que ele chamou e adiciona a nova na frente ficando assim:

1 - URL inicial
http://localhost:8080/projeto/

2 - URL com primeira chamada
http://localhost:8080/projeto/cadastro/pessoa.xhtml

3 - URL com segunda chamada
http://localhost:8080/projeto/cadastro/cadastro/imovel.xhtml

Acredito que a solução seria resgatar a URL inicial e montar a nova.
Alguém sugere algo?

eita cara eu fiz isso, mas o código tá em casa e no momento estou no trabalho.

Assim resolve:

    ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
    HttpServletRequest request = ((HttpServletRequest) context.getRequest());

            MenuItem mi = new MenuItem();
            mi.setValue(m.getNome());
            mi.setUrl(request.getContextPath()+m.getUrl());

Se alguém tiver alguma sugestão, até mesmo para ocultar o endereço completo.

[quote=aprendiz.devel]E ae galera,

Estou criando um menu dinâmico em meu projeto.
No momento de montar o menu eu dou um setUrl. Ele monta o menu tudo certinho.

O problema é que quando eu clico a primeira vez no menuItem, ele chama a URL correta isso porque estou na raiz de minha aplicação.
Agora quando eu clico em um outro menuItem, ele mantem a URL que ele chamou e adiciona a nova na frente ficando assim:

1 - URL inicial
http://localhost:8080/projeto/

2 - URL com primeira chamada
http://localhost:8080/projeto/cadastro/pessoa.xhtml

3 - URL com segunda chamada
http://localhost:8080/projeto/cadastro/cadastro/imovel.xhtml

Acredito que a solução seria resgatar a URL inicial e montar a nova.
Alguém sugere algo?[/quote]

Opa Valeio Bezerra,

Só vi sua mensagem depois que já tinha enviado.
Então, eu busquei em alguns lugares e só achei essa forma de fazer, funcionou legal, é mais ou menos parecida com a sua solução?

Estou buscando uma maneira de esconder a URL completa do usuário, conhece alguma maneira?

Valeu amigo,

[quote=Valeio Bezerra]eita cara eu fiz isso, mas o código tá em casa e no momento estou no trabalho.

[/quote]

Eu acho que é parecida sim, por que você ta querendo, para ele não burlar as permissões ?

Não, isso seria mais um capricho mesmo, e também reforçar um pouco mais a segurança.
Para permissões estou utilizando o Spring Security.
Nesse momento estou adaptando o Spring Security no menu dinâmico, tu usa ele também?

Não, eu fiz na mão mesmo rs. Até por que vou usar dialogs e não vou redirecionar, quer dizer, eu pretendo, vou ver se vai dá certo rs.

Hum, bacana.

Não sei se já conhece esse framework, eu acabei conhecendo ele faz pouco tempo e está sendo bem proveitoso.
Esse link tem um tutorialzinho bem bacana, caso se interessar.

http://jamacedo.com/2011/01/crud-jsf-2-parte-3-seguna-com-spring-security-3/

Conheci é bom até, mas não gostei muito, por que eu queria que as permissões do usuário que vou usar é dinâmica, tipo, um usuário pode ter acesso a 3 telas, onde só pode incluir, outro tem a 50 e por ai vai, não definido por “ROLE_ADMIN” essas coisas, por isso optei por não usar o spring.

Hum,

Então, eu preciso disso também.
Estou fazendo algumas adaptações, só que as regras são por telas, no meu caso estou chamando de ‘casos de uso’.
Aí fica:

ROLE_CADASTRO_PESSOA
ROLE_CADASTRO_BEM
ROLE_CADASTRO_MAQUINA

Até que está caminhando, vamos ver no que da.

Eu pensei nisso o problema é que no futuro quem sabe pode ser que tenha diversos módulos, contas a pagar, a receber, estoque entre outros, ai vai ficar muita coisa por isso eu faço tudo isso na mão, tenho cadastro de módulos, programas e autorizações de usuário.

Uhum, entendo.

Eu já tive oportunidade de trabalhar com um ERP gigantesco, era utilizado esse controle que você comenta.
Realmente, é mais prático pois o controle pode até ficar na mão do usuário.

Mas assim, levantando alguns problemas que identifiquei nesse caso.

  • Se caso o usuário conheça a URL de uma tela, como vai controlar o seu acesso sem ser pelo menu?

Tá dando trabalho no começo, mas depois de pronto é só desenvolver as novas telas e pronto, não vou ter mais nenhum trabalho com códigos, já com spring no seu caso toda vez que fizer uma nova vai ter que botar um “ROLE_CADASTRO_TELAX”.

[quote=aprendiz.devel]Uhum, entendo.

Eu já tive oportunidade de trabalhar com um ERP gigantesco, era utilizado esse controle que você comenta.
Realmente, é mais prático pois o controle pode até ficar na mão do usuário.

Mas assim, levantando alguns problemas que identifiquei nesse caso.

  • Se caso o usuário conheça a URL de uma tela, como vai controlar o seu acesso sem ser pelo menu?

Eu tenho um classe PadraoBean onde meus beans herdam dele, cada tela que eu faço tem seu código, eu passo pelo construtor o parâmetro e o padraoBean verifica se ele tem autorização, se não tiver ele redireciona dizendo que não tem acesso, se o usuário não tiver logado ele vai pra pagina de login.

Exemplo:

public class ClienteBean() extends PadraoBean {
  public ClienteBean() {
    super("codigoModulo", "codigoPrograma"); 
  }

}

Mas agora como cada tela que abro é um dialog não vou precisar mais disso, mas mesmo assim eu deixei.

Bacana Valeio Bezerra.
Vou ver no que da com o Spring Security…

valeu pelas sugestões aí amigo

[quote=Valeio Bezerra][quote=aprendiz.devel]Uhum, entendo.

Eu já tive oportunidade de trabalhar com um ERP gigantesco, era utilizado esse controle que você comenta.
Realmente, é mais prático pois o controle pode até ficar na mão do usuário.

Mas assim, levantando alguns problemas que identifiquei nesse caso.

  • Se caso o usuário conheça a URL de uma tela, como vai controlar o seu acesso sem ser pelo menu?

Eu tenho um classe PadraoBean onde meus beans herdam dele, cada tela que eu faço tem seu código, eu passo pelo construtor o parâmetro e o padraoBean verifica se ele tem autorização, se não tiver ele redireciona dizendo que não tem acesso, se o usuário não tiver logado ele vai pra pagina de login.

Exemplo:

public class ClienteBean() extends PadraoBean {
  public ClienteBean() {
    super("codigoModulo", "codigoPrograma"); 
  }

}

[/quote]

Ah, o dialog é outra coisa mesmo.

Acabei de resolver aquele problema da URL de forma mais elegante.
Se colocar ‘/’ antes da string ele renderiza de forma diferente, aí funciona direitinho.

Parece que foi agora.