Struts 2 - Usar os interceptor com excludeMethods

4 respostas
juloko666

Galera, estou fazendo alguma besteira pois criei um interceptor que extende “AbstractInterceptor” e o defini no topo da pilha de execução definindo que determinado método não será executado por aquele interceptor.

Mas, ao chamar o método, o interceptador entra em ação e não sei o por quê!

Segue o código de configuração:

<struts>
	<package name="pkgQualquer" extends="struts-default"	namespace="/pkgQualquer">

		<interceptors>
			<interceptor name="exceptionInterceptor" class="Excpetion" />
            <interceptor name="outroQualquer" class="OutroQualquer" />
			<interceptor name="InterceptorQueEstaComProblemas" class="MeuInterceptorComProblemas" />

			<interceptor-stack name="meuStack">
				<interceptor-ref name="InterceptorQueEstaComProblemas">
					<param name="excludeMethods">fazQualquerCoisa</param>
				</interceptor-ref>
                <interceptor-ref name="outroQualquer" />
                <interceptor-ref name="defaultStack" />
                <interceptor-ref name="exceptionInterceptor" />
 
	    	</interceptor-stack>
		</interceptors>

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

		<global-results>
			<result name="login">/login.jsp</result>
			<result name="error">/erro.jsp</result>
		</global-results>

		<action name="fazQualquerCoisa" method="fazQualquerCoisa" class="QualquerClasse">
			<result name="success" >/qualquerResultado.jsp</result>
		</action>
	</package>
</struts>

Ao chamar a ação “fazQualquerCoisa” ele entra no interceptor InterceptorQueEstaComProblemas…

o que eu estou fazendo de errado?

valew!

4 Respostas

bombbr

juloko666:
Galera, estou fazendo alguma besteira pois criei um interceptor que extende “AbstractInterceptor” e o defini no topo da pilha de execução definindo que determinado método não será executado por aquele interceptor.

Mas, ao chamar o método, o interceptador entra em ação e não sei o por quê!
Segue o código de configuração:

Seu interceptador deve estender com.opensymphony.xwork2.interceptor.MethodFilterInterceptor e não AbstractInterceptor como foi feito.

public class NovoInterceptor extends MethodFilterInterceptor {

	private static final long serialVersionUID = 2451021640004063591L;

	protected String doIntercept(ActionInvocation arg0) throws Exception {
                System.out.println("Interceptado");
		return arg0.invoke();
	}

}

Desta forma você pode usar o parametro excludeMethods.

<interceptor-ref name="InterceptorQueEstaComProblemas">  
                     <param name="excludeMethods">fazQualquerCoisa</param>  
  </interceptor-ref>
L

Oi, estou com o mesmo problema! Tentei fazer o que vc sugeriu mas o excludeMethod não funciona!

Alguma idéia do que pode ser? Não dá erro, mas não chama o método que eu gostaria.

Obrigada!

juloko666

Com o excludeMethod vc diz qual método NÃO será interceptado…Eu fiz a alteração que o bombbr falou e funcionou perfeitamente.

Poste o código para eu tentar te ajudar!

Abraços!

L

Meu problema é o seguinte:
O usuário só pode usar o sistema normalmente depois que trocar a senha. Então, preciso que o interceptor filtre tudo, exceto esse método que vai trocar a senha.
Mas ele não tá entrando no método trocarSenha.

Segue o código do struts.xml:

<package name="struts-sdtn" extends="struts-default">

    	<interceptors>
    		<interceptor name="login" class="pacote.LoginInterceptor"></interceptor>
    		<interceptor-stack name="xxxInterceptors">
           		<interceptor-ref name="login"><param name="excludeMethods">trocarSenha</param></interceptor-ref>
           		<interceptor-ref name="basicStack"/>
        	</interceptor-stack>
    	</interceptors>

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

        <global-results>
            <result name="primeiroAcesso"  type="redirect">/usuario/alterarSenhaInicial.jsp</result>
        </global-results>

        <action name="alterarSenhaInicial" method="alterarSenhaInicial" class="pacote.AlterarSenhaAction">
            <result>/usuario/alterarSenhaInicial.jsp</result>
        </action>
        <action name="trocarSenha" method="trocarSenha" class="pacote.AlterarSenhaAction">
            <result>/usuario/alterarSenhaInicial.jsp</result>
        </action>
        <action name="logout" method="logout" class="pacote.BaseAction">
           	<interceptor-ref name="basicStack"/>            
            <result>/login.jsp</result>
        </action>
        <action name="home" method="home" class="pacoteBaseAction">
            <result>/jsp/home.jsp</result>
        </action>
        
    </package>
Meu interceptor extend MethodFilterInterceptor:
public class LoginInterceptor extends MethodFilterInterceptor {

Tem idéia de onde estou errando?

Obrigada!!!

Criado 22 de dezembro de 2008
Ultima resposta 13 de fev. de 2009
Respostas 4
Participantes 3