Interceptor não é chamado no Struts 2

5 respostas
mcbarsotti

Olá a todos,

Estou implementando um interceptor de login no struts 2, o problema é que, na hora da chamada da action não acontece a chamada do interceptor antes, já é chamada a action direto, sem passar pelo interceptor.

segue o código:
Struts.xml

<struts>
	<!-- habilita o uso de outros métodos de action internamente na classe action
		<constant name="struts.enable.DynamicMethodInvocation" value="true" />
		<constant name="struts.devMode" value="false" />
	-->

	<package name="actions" namespace="/actions" extends="struts-default">
	
		<interceptors>
			<interceptor name="loginInterceptor" class="br.com.rdcomp.interceptors.LoginInterceptor"></interceptor>
			<interceptor-stack name="interceptors">
				<interceptor-ref name="loginInterceptor"/>
				<interceptor-ref name="paramsPrepareParamsStack"/>
			</interceptor-stack>
		</interceptors>

		<default-interceptor-ref name="interceptors" />
		
		<action name="Teste" class="br.com.rdcomp.actions.principal.Teste">
			<result>/jsp/index.jsp</result>
		</action>
				
	</package>
	
	<package name="login" namespace="/login" extends="struts-default">
	
		<global-results>
			<result name="startLogin">/login.jsp</result>
		</global-results>
	
		<action name="Login" class="br.com.rdcomp.actions.login.StartLogin">
			<result>/login.jsp</result>
		</action>
	</package>

</struts>

do Interceptor:

public class LoginInterceptor implements Interceptor {

	private static final long serialVersionUID = -8152162540645757675L;
	
	public void destroy() {
		// TODO Auto-generated method stub

	}

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

	}
	
	public String intercept(ActionInvocation invocation) throws Exception {
		Map<String, UserVO> session = invocation.getInvocationContext().getSession();
		if (session.containsKey("userVO")) {
			UserFuncionality userFunc = new UserFuncionality();
			// The user is logged but he dosen't have authorization to editing or visualize.
			if (!userFunc.isUserAuthorization((UserVO) session.get("userVO"))) {
				try {
					throw new UserVisualizationAuthorizationException(
					"Você não tem permissão para acessar essa tela.");
				} catch (UserVisualizationAuthorizationException e) {
					e.printStackTrace();
				}
			}
		} else {
			Map userParameters = ActionContext.getContext().getParameters();
			// if the user don't write nothing 
			if (!userParameters.get("userVO.user").equals("") && !userParameters.get("userVO.password").equals("")) {
				UserVO userVO = null;
				userVO.setUser(userParameters.get("userVO.user").toString());
				userVO.setPassword(userParameters.get("userVO.password").toString());
				UserFuncionality userFunc = new UserFuncionality();
				// if the user exists
				if (userFunc.isUserExists(userVO)) {
					userVO.setUserProfile(userFunc.getUserProfile(userVO));
					invocation.getInvocationContext().getSession().put("userVO", userVO);
				} else {
					try {
						throw new UserUnknownException("Usuario ou senha não existem, tente novamente.");
					} catch (UserUnknownException e) {
						e.printStackTrace();
					}
				}
			}else{
				return "startLogin";
			}
		}
		return invocation.invoke();
	}
}

5 Respostas

rodrigo_corinthians

Vc precisa colocar as tags interceptors dentro do package login, os interceptors funcionam no escopo do pacote caso queira que um interceptor seja sempre chamado precisa estar dentro do package default e seus packages estender ele.

mcbarsotti

Resolvi…

Foi um erro meu, cabacei hahuahu

Solução:
na linha do struts.xml:

<interceptor name="loginInterceptor" class="br.com.rdcomp.interceptors.login.LoginInterceptor"></interceptor>

faltava colocar o login.LoginInterceptor, o pacote estava errado.

Coloquei os interceptors somente no package actions porque a action Login não necessita passar por nenhuma validação, ela somente exibe a pagina de login no sistema.

Obrigado pela ajuda!!!

ps: se alguem quiser aceitar o desafio e tentar responder oque até agora ninguem conseguiu, segue os links:
http://www.guj.com.br/posts/list/66341.java#349384
http://www.guj.com.br/posts/list/66130.java#349100

Muito obrigado a todos!!! :lol:

F

alguem sabe como fazer interceptor por meio de annotations?

M

Olá.

Alguem sabe como fazer uso do Interceptor por meio de annotations?

Vlw.

R

Vou precisar fazer o mesmo esquema em minha aplicação.

Vc conseguiu implementar o interceptador de validação de login com sucesso?

Ao inves de disparar uma excessao caso o usuario nao tenha permissao de acessar tal modulo, o sistema nao poderia dar um return “Home” por exemplo e retornar para a home do site?

Se eu precisa-se validar a permissao por action, como eu faria?

vlw!

Criado 9 de agosto de 2007
Ultima resposta 6 de out. de 2009
Respostas 5
Participantes 5