Ajuda Struts 2

7 respostas
fabioebner
Pessoal estou com um problema com interceptor no Struts2 , desenvolvi um interceptor que verifica se o usuario esta logado, se ele estiver continua, se nao estiver vai para pagina de erro, porem quando ele passa pelo interceptor e retorna para a action as minhas variaveis enviadas estao sendo zeradas(null) ja li varias pessoas falando para colocar um defaultStack porem nao consegui nada ainda, alguem pode me ajudar?? segue meu codigo abaixo: LoginUsuarioInterceptor.java
package br.com.dnasolution.site.interceptor;

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

public class LoginUsuarioInterceptor implements Interceptor {

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

	}

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

	}

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		if(invocation.getInvocationContext().getSession().get("usuarioLogado") != null){
			return invocation.invoke();
		}else{
			return "usuarioNaoLogado";
		}
	}

}
LoginClienteInterceptor.java
package br.com.dnasolution.site.interceptor;

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

public class LoginClienteInterceptor implements Interceptor {

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

	}

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

	}

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		if(invocation.getInvocationContext().getSession().get("clienteLogado") != null){
			return invocation.invoke();
		}else{
			return "clienteNaoLogado";
		}
	}

}
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="my-secure"
			 extends="convention-default">
		<interceptors>
			<interceptor name="loginUsuarioInterceptor"
						 class="br.com.dnasolution.site.interceptor.LoginUsuarioInterceptor">
			</interceptor>
			<interceptor name="loginClienteInterceptor"
						 class="br.com.dnasolution.site.interceptor.LoginClienteInterceptor">
			</interceptor>
			<interceptor-stack name="secureStack">
				<interceptor-ref name="defaultStack"/>
				<interceptor-ref name="loginClienteInterceptor"/>
				<interceptor-ref name="loginUsuarioInterceptor"/>
			</interceptor-stack>
		</interceptors>

		<default-interceptor-ref name="secureStack"/>

		<global-results>
			<result name="clienteNaoLogado">/jsp/usuario/loginUsuario.jsp
			</result>
			<result name="clienteNaoLogado">/jsp/cliente/loginCliente.jsp
			</result>
		</global-results>

	</package>
</struts>

e a minha action

OrdemServicoAction.java
package br.com.dnasolution.site.action;

@ParentPackage("my-secure")
public class OrdemServicoAction {

@Action(value = "cadastrarOrdemServico", results = {
			@Result(name = "valido", location = "/jsp/ordemservico/cadastro_sucesso.jsp"),
			@Result(name = "invalido", location = "/jsp/ordemservico/cadastro_falha.jsp") }, interceptorRefs = { @InterceptorRef("loginClienteInterceptor") })
	public String cadastrarOrdemServico() {
		try {
			TbProjeto projetoOS = projetoService
					.getProjetoById(this.cdProjetoOS);
			TbTopicoOs topicoOs = topicoOsService.getTopicoById(cdTopicoOS);
....
}}

sera quem alguem vai conseguir me ajudar??

valeu

7 Respostas

jyoshiriro

Amigo, a primeira dica que dou é não criar interceptors implementando a interface Interceptor e sim estender o AbstractInterceptor.

Outra Dica:
Mão precisa de 2 mapeamentos “clienteNaoLogado”. Basta 1.

Quanto ao seu problema, não entendei bem…

variáveis sendo zeradas? como assim? que variáveis? e deveriam ter sido exibidas onde e como?

Abraços.

fabioebner

Boaaa na verdade ali e um de usuario e outro de Cliente :smiley: vou arrumar

entao o problema e que quando eu clico no botao para enviar o meu formulario com o valor do cdTopicoOS que eu tenho o getter and setter na minha action, ele apos passar pelo interceptor, ele retorna para a action com o cdTopicoOS nullo, se eu tirar o interceptor ele vai com o valor preenchido normalmente, meu problema e quando passa pelo interceptor

valeu

jyoshiriro

Bem, então tenta fazer aquilo que sugeri sobre os Interceptors (Interface fora, entra AbastractInterceptor)

fabioebner

Cara eu consegui era so eu colocar no meu codigo

@InterceptorRef("loginClienteInterceptor"), @InterceptorRef("defaultStack")

deve ter uma forma de juntar os dois em um no struts.xml, mas ainda nem tentei pra falar a verdade :smiley:

valeu

estou com uma outra duvida referente as Tags, sera que vc consegue me ajudar? eu utilizo aquelas tag de <sx:datetimepicker /> sabe? entao quando eu deixo no meu web.xml mapeado para /* ele funciona porem eu tive que mudar pois estou utilizando WS entao eu deixei assim:

<filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/jsp/*</url-pattern> </filter-mapping>
porem agora minhas tags nao funcionam mais, se eu voltar para /* volta a funcionar, sabe o pq??

valeu

jyoshiriro

Ah, sim…

você poderia ter feito também:

@InterceptorRef("secureStack")

Já que este passa pelos seus mais o “defaultStack” conforme você mapeou no XML.

fabioebner

Era isso que eu tinha pensado, ia tentar hj de noite em casa :smiley: mas nesse caso daria errado nao daria? pq se eu so estou logado como cliente por exemplo quando ele passar pelo usuario ia falar que nao estava logado, logo eu tenho que fazer um stack para cada conjunto neh?? e no interceptor chamar @InterceptorRef(“secureStackCliente”) por exemplo?

Francisco_Helcio_Pac

Fabio,

Estou passando,acredito, pelo mesmo problema que você passou alguns meses atrás.

Tentei resolver pelas dicas do colega mas sem sucesso.
Gostaria que me enviasse seu arquivo web.xml pra que eu verifique algo errado.

O meu web.xml está assim

struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter actionPackages action
</filter>
<filter-mapping>
	<filter-name>struts2</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

e abaixo meu arquivo struts.xml

/login.jsp

Já registrei na minha action o interceptor… e estou extendendo AbstractInterceptor na classe Interceptor.

Encontro o seguinte erro quando vou rodar o login:

INFO: Parsing configuration file [struts.xml]

31/01/2011 11:35:01 com.opensymphony.xwork2.util.logging.commons.CommonsLogger error

SEVERE: Dispatcher initialization failed

Unable to load configuration. - [unknown location]

at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:69)

at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:371)

at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:415)

o que me gera um Erro HTTP Status 404

Se puder me ajudar…
Obrigado,
abraço.

Criado 13 de julho de 2010
Ultima resposta 31 de jan. de 2011
Respostas 7
Participantes 3