Ajuda-Interceptor

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

[code]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

}

}[/code]

struts.xml

[code]








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

[/code]

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

Caio, segue o código.

[code]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;
}

}[/code]

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()?

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.

Entendi, tenta ai, vê se funciona, mas de qualquer forma, usa o debug e vê se ele está sendo registrado na sessão.

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?

[code]<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

J-Ocor :: Área Técnica

Área técnica


Bem vindo ${tecnico.nome}.
[/code]

Vc está usando o Eclipse? Posta sua jsp da página de login.

Sim estou usando o eclipe.

Segue o jsp com a pagina de login:

[code]<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

form.adiciona { background-color: #FFFFCC; width:380px; border: 2px solid #0000FF; padding-left:10px; } J-Ocor : Login Técnicos

Informe Login e Senha


Login:
Senha:


[/code]

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

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

[code]
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://[/code]

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

[code]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;
}
}[/code]

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.

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.

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: