Finalizei um projeto, bacana no vraptor. E não estou conseguindo acertar uma coisinha.
Eu fiz uma anotação, chamada liberada. E eu só quero liberar a página inicial, onde eu coloquei o formulário de login. Como eu faço para implementar esse método aqui.
// Vai interceptar se o metodo não tiver a anotação Liberado e o usuário não estiver logado.
public boolean accepts(ResourceMethod method) {
return !usuario.isLogado() && !method.containsAnnotation(Liberado.class);
}
se o usuario estiver logado ele vai ter acesso a todas as paginas?
se for isso seu metodo deveria estar assim
// Vai interceptar se o metodo não tiver a anotação Liberado e o usuário não estiver logado.
public boolean accepts(ResourceMethod method) {
if(usuario.isLogado()){ // se ele estiver logado tera acesso a todas as paginas
return true;
}
//se não so terá acesso as que estiverem anotadas com Liberado
return method.containsAnnotation(Liberado.class);
}
package eletronica.infra.interceptores;
import eletronica.infra.interfaces.Liberado;
import eletronica.modelo.UsuarioWeb;
import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.blank.IndexController;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.resource.ResourceMethod;
/*
* Anotação - Interceptar Onde encontrar a anotação, vai ser interceptada
* Metodo intercept vai ser executado.
*/
@Intercepts
public class UsuarioInterceptor implements Interceptor {
// Variavéis
private final UsuarioWeb usuario;
private final Result result;
// Construtor
public UsuarioInterceptor(UsuarioWeb usuario, Result result) {
this.usuario = usuario;
this.result = result;
}
// Vai interceptar se o metodo não tiver a anotação Liberado
public boolean accepts(ResourceMethod method) {
return false;
}
// Metodo intercept - o que deve ser feito quando é encontrado a anotação
public void intercept(InterceptorStack stack, ResourceMethod method,
Object resourceInstance) throws InterceptionException {
result.redirectTo(IndexController.class).index();
}
}
Uma coisa, a anotação @Liberado está em método.
Conforme aqui.
@Path("/")
@Liberado
public void index() {
result.include("variable", "VRaptor!");
}
Eu tinha deixado com false, para não interceptar. Porque dessa forma estava bloqueando tudo.
// Vai interceptar se o metodo não tiver a anotação Liberado e o usuário não estiver logado.
public boolean accepts(ResourceMethod method) {
return !usuario.isLogado() && !method.containsAnnotation(Liberado.class);
}
Cara, ainda não funcionou. Acredita.
Olha minha classe Usuário.
@Entity
public class Usuario {
@Id
@GeneratedValue
private Long id;
private String nome;
private String login;
private String senha;
//getters and setters
}
Minha classe UsuarioWeb;
@Component
@SessionScoped
public class UsuarioWeb {
private Usuario logado;
public void login(Usuario usuario) {
this.logado = usuario;
}
public String getNome() {
return logado.getNome();
}
public String getLogin() {
return logado.getLogin();
}
public Long getId() {
return logado.getId();
}
public boolean isLogado() {
return logado != null;
}
public void logout() {
this.logado = null;
}
}
Meu UsuarioController
[code] @Resource
public class UsuarioController {
private final UsuarioWeb usuarioWeb;
private final UsuarioDAO dao;
private final Result result;
private final Validator validator;
public UsuarioController(UsuarioDAO dao, Result result,
Validator validator, UsuarioWeb usuarioWeb) {
this.dao = dao;
this.result = result;
this.validator = validator;
this.usuarioWeb = usuarioWeb;
}
public void loginForm() {
}
@Path("/usuario/novo")
public void novo() {
}
@Post("/usuario")
public void adiciona(Usuario usuario) {
if (dao.existeUsuario(usuario)) {
validator.add(new ValidationMessage("Login já existe",
"usuario.login"));
}
validator.onErrorUsePageOf(UsuarioController.class).novo();
dao.adiciona(usuario);
result.redirectTo(IndexController.class).index();
}
@Post("/login")
public void login(Usuario usuario) {
Usuario carregado = dao.carrega(usuario);
if (carregado == null) {
validator.add(new ValidationMessage("Login e/ou senha inválidos",
"usuario.login"));
}
validator.onErrorUsePageOf(UsuarioController.class).loginForm();
usuarioWeb.login(carregado);
result.redirectTo(AdministracaoController.class).administracao();
}
@Path("/logout")
public void logout() {
usuarioWeb.logout();
result.redirectTo("/");
}
@Get("/usuario")
public List<Usuario> lista() {
return dao.listaTudo();
}
// Edição
@Get("/usuario/{id}")
public Usuario edita(Long id) {
//Include lista de bairros
return dao.carrega(id);
}
// Alteração - Gera a interface para alterar
// Envia o ID para alterar
@Put("/usuario/{usuario.id}")
public void altera(final Usuario usuario) {
dao.atualiza(usuario);
// Redireciona para a paǵina
result.redirectTo(this).lista();
}
// Remove
// Envia o ID para Remoção
@Delete("/usuario/{id}")
public void remove(Long id) {
Usuario usuario = dao.carrega(id);
dao.remove(usuario);
// Redireciona para a listagem, após a inserção.
result.redirectTo(this).lista();
}
// Busca por nome
public List<Usuario> busca(String nome) {
result.include("nome", nome);
return dao.busca(nome);
}
// Busca Json para auto completar
@Get("/usuario/busca.json")
public void buscaJson(String q) {
result.use(json()).withoutRoot().from(dao.busca(q)).exclude("id")
.serialize();
}
}[/code]
Meu interceptor
@Intercepts
public class UsuarioInterceptor implements Interceptor {
// Variavéis
private final UsuarioWeb usuario;
private final Result result;
// Construtor
public UsuarioInterceptor(UsuarioWeb usuario, Result result) {
this.usuario = usuario;
this.result = result;
}
// Vai interceptar se o metodo não tiver a anotação Liberado
public boolean accepts(ResourceMethod method) {
return !usuario.isLogado() && !method.containsAnnotation(Liberado.class)
&& !method.getResource().getType().isAnnotationPresent(Liberado.class);
}
// Metodo intercept - o que deve ser feito quando é encontrado a anotação
public void intercept(InterceptorStack stack, ResourceMethod method,
Object resourceInstance) throws InterceptionException {
result.redirectTo(IndexController.class).index();
}
}