¿Hay alguna manera de redirigir a otra clase de acción sin usar en struts.xml

Tengo muchas clases creadas en mi aplicación Struts. No revisé si estaba registrado en alguna de las clases. En cambio, he extendido una clase de acción básica.

Ahora quiero crear un controlador previo en mi acción base para verificar el inicio de sesión y redirigir si no están conectados. Quiero algo como esto.

public BaseAction(){ if(isLoggedIn){ //go to child which was called } else { //redirect to login page } } 

Otra forma es verificar isLoggedIn() llamando a este método en todas las clases de acción y definiendo un resultado global como

 Login.action 

Por favor, ayúdame a encontrar una mejor manera para esto.

Parece que quiere verificar el constructor de la clase de acción base, pero está equivocado. El constructor es utilizado por la fábrica de objetos para instanciar su instancia de acción. En esta etapa, hay algunas cosas disponibles para ti. En tu caso, está mal. Otro enfoque es si mueve la lógica al método, digamos execute() y llama a super.execute() antes de que funcione cualquier llamada a método, pero si olvida poner la súper llamada en la acción, entonces puede terminar ejecutando el código de acción no autenticado. Para evitarlo, debe ejecutar el código antes de ejecutar cualquier acción y poder acceder a la instancia de acción o contexto de acción para que sea más Struts2. Supongo que nunca has leído el libro “Struts 2 in Action”, así que te daré algunos de mis propios pensamientos. Se trata de crear AuthenticationInterceptor y la acción que implementa UserAware que inyecta al usuario que UserAware sesión en la acción que implementa esta interfaz. El interceptor se ve como

 public class AuthenticationInterceptor implements Interceptor { public void destroy() { } public void init() { } public String intercept(ActionInvocation actionInvocation) throws Exception { Map session = actionInvocation.getInvocationContext().getSession(); User user = (User) session.get(Struts2MyConstants.USER); if (user == null) { return Action.LOGIN; //login required result } else { Action action = (Action)actionInvocation.getAction(); if (action instanceof UserAware) { User freshUser = myService.getUser(user.getId()); ((UserAware)action).setUser(freshUser); } System.out.println("Logged in: interceptor"); return actionInvocation.invoke(); } } 

El UserAware se parece a

 public interface UserAware { public void setUser( User user ); } 

y crea una stack predeterminada segura que hará referencia a cualquier acción

         

Si realiza su acción base para implementar UserAware entonces el objeto de usuario que está conectado estará disponible no solo desde la sesión sino también en acción si define getter para el usuario o lo protege. Debe hacer que el objeto User inmutable para que no comprometa la función de seguridad.

Puedes usar un Filter . Será mucho más transparente que requerir que todas sus clases extiendan su BaseAction .

Editar

Debería asignar este filtro a su archivo web.xml, por lo que se ejecutaría antes del servlet del controlador Struts.

  AuthorizationFilter my.company.AuthorizationFilter   AuthorizationFilter StrutsActionServlet  

O por patrón de URL:

  AuthorizationFilter *.do  

Editar

Has cambiado la pregunta, y parece que son los puntales 2 que estás usando después de todo. En ese caso, puede escribir un interceptor en lugar de un filtro. Básicamente haría lo mismo, pero se puede configurar un interceptor junto con el rest de la configuración de sus puntales.