Ajuda-Interceptor

14 respostas
andre_rjp

Bom dia!

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
package br.com.jocor.interceptor;

import br.com.jocor.modelo.Tecnico;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class AutorizadorInterceptor implements Interceptor {
	
	public String intercept(ActionInvocation invocation) throws Exception {
		Tecnico tecnicoLogado = (Tecnico) invocation.getInvocationContext()
				.getSession().get("tecnicoLogado");
		if (tecnicoLogado == null) {
			return "tecnicoNaoLogado";
		}
		return invocation.invoke();
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void init() {
		// TODO Auto-generated method stub

	}

}
struts.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<package name="default" extends = "struts-default">
	<interceptors>
		<interceptor name="autorizador"
			class="br.com.jocor.interceptor.AutorizadorInterceptor"/>
			<interceptor-stack name="seguranca">
				<interceptor-ref name="autorizador" />
				<interceptor-ref name="defaultStack" />
			</interceptor-stack>
	</interceptors>
	
	<global-results>
		<result name="tecnicoNaoLogado">/WEB-INF/content/login-tecnico.jsp</result>
	</global-results>
	
		<action name="loginTecnico" >
			<result>/WEB-INF/content/login-tecnico.jsp</result>
		</action>
		
		<action name="adicionaTecnico" >
			<result>/WEB-INF/content/adiciona-tecnico.jsp</result>
		</action>
	</package>
</struts>

14 Respostas

caio_ferreira

Posta o código onde vc adiciona o usuário na sessão

andre_rjp

Caio, segue o código.

package br.com.jocor.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import br.com.jocor.dao.TecnicoDAO;
import br.com.jocor.modelo.Tecnico;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
import com.opensymphony.xwork2.validator.annotations.StringLengthFieldValidator;
import com.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")
		})

public class LoginTecnicoAction extends ActionSupport {

	private Tecnico tecnico;

	@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")})
	public String login(){
		if (new TecnicoDAO().existeTecnico(tecnico)){
			ActionContext.getContext().getSession().put("tecnicoLogado", tecnico);
			return "ok";
		}
		return "invalido";
		
	}
	public Tecnico getTecnico() {
		return tecnico;
	}

	public void setTecnico(Tecnico tecnico) {
		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?

<%@ page language="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>
<meta http-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>
	<a href="adicionaTecnico"><input type="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:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<style type="text/css">
form.adiciona {
background-color: #FFFFCC;
width:380px;
border: 2px solid #0000FF;
padding-left:10px;
}
</style>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>J-Ocor : Login Técnicos</title>
</head>
<body>
<c:import url="cabecalho.jsp"></c:import>
<script language="javascript" >
	function soNumero( obj , e )
	{
    	var tecla = ( window.event ) ? e.keyCode : e.which;
    	if ( tecla == 8 || tecla == 0 )
        	return true;
    	if ( tecla != 44 && tecla < 48 || tecla > 57 )
        	return false;
	}	
</script>

<center>
	<h3>Informe Login e Senha</h3>
	<form name="login" class ="adiciona" action="loginTecnico" method="post"><br>
		Login:<input name="tecnico.matricula" type="text" onkeypress="return soNumero( this , event );
	" Maxlength="5" size="5"/><br/>
		Senha:<input name="tecnico.senha" type="password" size="5" Maxlength="6" size="5"><br>
		<input  type="submit" value="Login"/>
	</form>
<center><br><br><c:import url="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.

http://www.madrugadacomcafe.com/2011/12/tutorial-como-usar-debug-do-eclipse.html

andre_rjp
acho que meu objeto técnico está retornando nulo mesmo, abri o mesmo projeto pelo Google Chrome e retornou esse erro:
HTTP ERROR 500

Problem accessing /Jocor/adicionaTecnico. Reason:

    INTERNAL_SERVER_ERROR
Caused by:

java.lang.NullPointerException
	at br.com.jocor.dao.TecnicoDAO.adiciona(TecnicoDAO.java:27)
	at br.com.jocor.action.AdicionaTecnicoAction.execute(AdicionaTecnicoAction.java:24)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
	at br.com.jocor.interceptor.AutorizadorInterceptor.intercept(AutorizadorInterceptor.java:16)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
	at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
	at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
	at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.Server.handle(Server.java:326)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
	at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:928)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Powered by Jetty://
andre_rjp

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
package br.com.jocor.action;


import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;

import br.com.jocor.dao.TecnicoDAO;
import br.com.jocor.modelo.Tecnico;


@ParentPackage("default")
public class AdicionaTecnicoAction  {
	private Tecnico tecnico;
	@Action(value="adicionaTecnico", results={@Result( name="ok",location="tecnico-adicionado.jsp")},
			interceptorRefs= {
					@InterceptorRef("seguranca")})

	
	public String execute(){
		System.out.println("Adicionando novo técnico...");
		TecnicoDAO dao =new TecnicoDAO();
		dao.adiciona(tecnico);
		return "ok";
}
	public Tecnico getTecnico() {
		return tecnico;
	}
	public void setTecnico(Tecnico tecnico) {
		this.tecnico = tecnico;
	}		
}
caio_ferreira

kra, remove esse código do seu struts.xml

<action name="adicionaTecnico" >  
            <result>/WEB-INF/content/adiciona-tecnico.jsp</result>  
</action>

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 :cry:

Criado 13 de fevereiro de 2012
Ultima resposta 13 de fev. de 2012
Respostas 14
Participantes 2