Bom dia,
Estou fazendo um controle simples de acesso, para inicialmente gerenciar o login, mas como meu sistema tem mais opções a serem bloqueadas fiz o processo inverso liberando somente os métodos que eu tenho livre acesso.
O que acontece é que quando vou fazer a validação de login e senha, ao retornar o uniqueresult do hibernate.
Me retorna o seguinte erro.
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.StringIndexOutOfBoundsException: String index out of range: 0
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
java.lang.StringIndexOutOfBoundsException: String index out of range: 0
java.lang.String.charAt(Unknown Source)
Só que isso só acontece quando tem o dado correto no banco, pois quando não tenho, retorna minha mensagem normalmente.
Segue
Interceptadorpackage br.com.tga.juridico.login;
import javax.servlet.http.HttpServletRequest;
import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.caelum.vraptor.resource.ResourceMethod;
import br.com.tga.juridico.controller.diversos.LoginController;
import br.com.tga.juridico.diversos.AcessoLiberado;
@Intercepts
@RequestScoped
public class LoginInterceptor implements Interceptor {
private final HttpServletRequest request;
private final Result result;
private final Login login;
public LoginInterceptor(HttpServletRequest request,Result result, Login login) {
this.request = request;
this.result = result;
this.login = login;
}
@Override
public boolean accepts(ResourceMethod method) {
return (this.login == null || !this.login.estaLogado()) && (!method.containsAnnotation(AcessoLiberado.class));
}
@Override
public void intercept(InterceptorStack stack, ResourceMethod method,
Object resourceInstance) throws InterceptionException {
String uri = request.getRequestURI();
result.redirectTo(LoginController.class).login(uri);
}
// stack.next(method, resourceInstance); caso queira que continue normalmente.
}
LoginController
package br.com.tga.juridico.controller.diversos;
import javax.servlet.http.HttpServletRequest;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.tga.juridico.dao.cadastros.UsuarioDao;
import br.com.tga.juridico.diversos.AcessoLiberado;
import br.com.tga.juridico.entidades.cadastros.Usuario;
import br.com.tga.juridico.login.Login;
import static br.com.caelum.vraptor.view.Results.json;
@Resource
public class LoginController {
private HttpServletRequest request;
private final Result result;
private final Login login;
private final UsuarioDao usuarioDao;
public LoginController(HttpServletRequest request, Result result,
Login login,UsuarioDao usuarioDao) {
this.request = request;
this.result = result;
this.login = login;
this.usuarioDao = usuarioDao;
}
@AcessoLiberado
@Get("/login")
public void login(String url) {
System.out.println(url);
result.include(url);
}
@AcessoLiberado
@Post("/login")
public void login(String login, String senha, String url) {
String retorno = "false";
Usuario usuario = usuarioDao.verificaLoginSenha(login, senha);
if (usuario != null) {
this.login.setUsuario(usuario);
retorno = "true";
}
result.use(json()).from(retorno).serialize();
}
@Path("/logoff")
public void logoff() {
request.getSession().invalidate();
result.redirectTo(LoginController.class).login("/login");
}
}
UsuarioDao
@AcessoLiberado
public Usuario verificaLoginSenha(String login, String senha){
Criteria crt = this.session.createCriteria(Usuario.class);
crt.add(Restrictions.sqlRestriction("login = '"+login+"' and senha = '"+senha+"'"));
Usuario usuario = /*new Usuario();*/ (Usuario)crt.uniqueResult();
//usuario.setNome("kiver");
return usuario;
}
OBS*:
Fiz um teste e instanciando um Usuario, tudo me retorna certo, o que acredito que seja um problema com o hibernate no interceptador, mas não imagino como resolver.