Galera estou com um projeto aqui (sistema que gerencia ocorrencias), implementei o método de login, crio a sessão até ai tudo ok, porém criei um interceptor para o usuario nao ir para a area técnica que é um jsp que se encontra na pasta content do meu projeto, porém mesmo eu estando devidamente logado quando clico em um submit que aponta para a ação adicionaTecnico ele volta para a tela de login, alguém poderia me auxiliar com relação a isso desde já te agradeço.
Classe interceptor
Posta o código onde vc adiciona o usuário na sessão
andre_rjp
Caio, segue o código.
packagebr.com.jocor.action;importorg.apache.struts2.convention.annotation.Action;importorg.apache.struts2.convention.annotation.Result;importbr.com.jocor.dao.TecnicoDAO;importbr.com.jocor.modelo.Tecnico;importcom.opensymphony.xwork2.ActionContext;importcom.opensymphony.xwork2.ActionSupport;importcom.opensymphony.xwork2.validator.annotations.RequiredStringValidator;importcom.opensymphony.xwork2.validator.annotations.StringLengthFieldValidator;importcom.opensymphony.xwork2.validator.annotations.Validations;@Validations(requiredStrings={@RequiredStringValidator(fieldName="tecnico.matricula",message="Valor obrigatório")},stringLengthFields={@StringLengthFieldValidator(fieldName="tecnico.matricula",minLength="5",message="Minimo de 5 caracteres")})publicclassLoginTecnicoActionextendsActionSupport{privateTecnicotecnico;@Action(value="loginTecnico",results={@Result(name="ok",location="area-tecnica.jsp"),@Result(name="invalido",location="erro-login.jsp"),@Result(name="input",location="login-tecnico.jsp")})publicStringlogin(){if(newTecnicoDAO().existeTecnico(tecnico)){ActionContext.getContext().getSession().put("tecnicoLogado",tecnico);return"ok";}return"invalido";}publicTecnicogetTecnico(){returntecnico;}publicvoidsetTecnico(Tecnicotecnico){this.tecnico=tecnico;}}
caio_ferreira
estranho, vc fez um debbug e viu se passa pelo metodo login() e registra o usuário na sessão?? Não tenho certeza, pois estou estudando struts faz pouco tempo, mas o metodo login, no caso não deveria ser o execute()?
andre_rjp
Vou mudar pra execute pra ver se funciona, comecei a estudar struts agora também, ai estou com algumas dúvidas também, pelo que meu instrutor falou não interfere o nome do método execute para login.
caio_ferreira
Entendi, tenta ai, vê se funciona, mas de qualquer forma, usa o debug e vê se ele está sendo registrado na sessão.
andre_rjp
Poxa caio como faço o debug e vejo se está sendo registrado na sessão? mudei para execute e não funcionou.
Aqui o meu código jsp, teria algum erro nele?
<%@pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"><title>J-Ocor :: Área Técnica</title></head><body><h4>Área técnica</h4><br>
Bem vindo ${tecnico.nome}.<br><form><ahref="adicionaTecnico"><inputtype="submit"value="Adicionar Novos Técnicos.."></a></form></body></html>
caio_ferreira
Vc está usando o Eclipse? Posta sua jsp da página de login.
andre_rjp
Sim estou usando o eclipe.
Segue o jsp com a pagina de login:
<%@pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html><head><styletype="text/css">form.adiciona{background-color:#FFFFCC;width:380px;border:2pxsolid#0000FF;padding-left:10px;}</style><metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"><title>J-Ocor:LoginTécnicos</title></head><body><c:importurl="cabecalho.jsp"></c:import><scriptlanguage="javascript">functionsoNumero(obj,e){vartecla=(window.event)?e.keyCode:e.which;if(tecla==8||tecla==0)returntrue;if(tecla!=44&&tecla<48||tecla>57)returnfalse;}</script><center><h3>InformeLogineSenha</h3><formname="login"class="adiciona" action="loginTecnico" method="post"><br>Login:<inputname="tecnico.matricula"type="text"onkeypress="return soNumero( this , event );" Maxlength="5" size="5"/><br/>Senha:<inputname="tecnico.senha"type="password"size="5"Maxlength="6"size="5"><br><inputtype="submit"value="Login"/></form><center><br><br><c:importurl="rodape.jsp"></c:import></center></body></html>
caio_ferreira
Não consegui ver nada de errado, mas eu não estou em casa para testar, faz o seguinte, para vc debugar, vc tem que adicionar um toggle breakpoint na linha, no Eclipse, da dois cliques em cima do número da linha que você quer para o código, ou clique com o botão direito do mouse e Toggle Breakpoint, ai vc sobe seu servidor em mode debug.
Então consegui debugar aqui, na linha 13 do AutorizadorInterceptor não está nulo, já no AdicionaTecnicoAction meu objeto tecnico está nulo.
agora não sei mais o que fazer, deixando na Webcontent, e chamando o adiciona-tecnico.jsp funciona, mas ai fica facil de acessar essa url sem fazer login.
segue o código do AdicionaTecnicoAction
packagebr.com.jocor.action;importorg.apache.struts2.convention.annotation.Action;importorg.apache.struts2.convention.annotation.InterceptorRef;importorg.apache.struts2.convention.annotation.ParentPackage;importorg.apache.struts2.convention.annotation.Result;importbr.com.jocor.dao.TecnicoDAO;importbr.com.jocor.modelo.Tecnico;@ParentPackage("default")publicclassAdicionaTecnicoAction{privateTecnicotecnico;@Action(value="adicionaTecnico",results={@Result(name="ok",location="tecnico-adicionado.jsp")},interceptorRefs={@InterceptorRef("seguranca")})publicStringexecute(){System.out.println("Adicionando novo técnico...");TecnicoDAOdao=newTecnicoDAO();dao.adiciona(tecnico);return"ok";}publicTecnicogetTecnico(){returntecnico;}publicvoidsetTecnico(Tecnicotecnico){this.tecnico=tecnico;}}
vc já mapeou ela por anotação na classe AdicionaTecnicoAction , por isso não está passando pelo interceptor, faz o teste ai.
andre_rjp
Caramba, fiz o que recomendou e continuou sem funcionar, ai mapeei para minha a classe AdicionaTecnicoAction para o interceptor “defaultStack”, o Objeto tecnico continuou como nulo, coloquei mais um result na minha classe AdicionaTecnicoAction apontando para ela mesmo se o name for “input”, agora até direciona para a JSP correta porém quando insiro os dados do novo técnico nao salva e volta para essa pagina adiciona-tecnico.jsp, é como se meu objeto tecnico apontasse sempre pra null.
andre_rjp
O que fiz agora foi excluir do struts.xml a tag interceptors e acessei diretamente o meu arquivo adiciona-tecnico.jsp agora aceita gravar, o objeto tecnico nao é nulo, porém nao tenho mais meu interceptador para essa Action