2

我在我的 Struts 应用程序中创建了许多类。我没有检查是否在任何课程中都处于登录状态。相反,我扩展了一个基本动作类。

现在我想在我的基本操作中创建一个预处理程序来检查登录并在他们未登录时重定向。

我想要这样的东西:

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

另一种方法是isLoggedIn()通过在所有动作类中调用此方法并定义一个全局结果来检查

<result name="not-logged-in" type="redirectAction">Login.action</result>

请帮助我找到更好的方法。

4

2 回答 2

3

看起来你想签入基本动作类的构造函数,但你错了。对象工厂使用构造函数来实例化您的操作实例。在这个阶段,您可以使用一些东西。在你的情况下,这是错误的。另一种方法是,如果您在任何方法调用起作用之前将逻辑移动到方法 sayexecute()和 callsuper.execute()中,但是如果您忘记将超级调用放入操作中,那么您可能最终导致操作代码运行未经过身份验证。为了防止它,您应该在执行任何操作之前运行代码,并且能够访问操作实例或操作上下文以更 Struts2。我猜你从来没有读过Struts 2 in Action这本书,所以我会给你一些我自己的想法。这是关于创造AuthenticationInterceptor和实施的行动UserAware将登录的用户注入到实现此接口的操作中。拦截器看起来像

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();
    }
}

看起来UserAware

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

并创建一个安全的默认堆栈来引用任何操作

<interceptors>
  <interceptor name="authenticationInterceptor" class="org.yourapp.struts.interceptor.AuthenticationInterceptor"/>
  <interceptor-stack name="secureStack">
    <interceptor-ref name="authenticationInterceptor"/>
    <interceptor-ref name="defaultStack"/>
  </interceptor-stack>
</interceptors>
<default-interceptor-ref name="secureStack"/> 

如果您执行基本操作,UserAware那么登录的用户对象不仅可以从会话中使用,而且如果您为用户定义 getter 或使其受到保护,也可以在操作中使用。您必须使User对象不可变,以免损害安全功能。

于 2013-04-27T19:26:22.017 回答
2

您可以使用Filter. 这将比要求所有类扩展您的BaseAction.

编辑

您将在 web.xml 文件中映射此过滤器,因此它将在 Struts 控制器 servlet之前执行。

<filter>
   <filter-name>AuthorizationFilter</filter-name>
   <filter-class>my.company.AuthorizationFilter</filter-class>
</filter>

<filter-mappging>
    <filter-name>AuthorizationFilter</filter-name>
    <servlet-name>StrutsActionServlet</servlet-name>
</filter-mapping>

或通过 URL 模式:

<filter-mapping>
    <filter-name>AuthorizationFilter</filter-name>
    <url-pattern>*.do</url-pattern>
</filter-mapping>

编辑

您已经更改了问题,看来您毕竟使用的是 struts 2。在这种情况下,您可以编写拦截器而不是过滤器。它基本上会做同样的事情,但拦截器可以与你的其他 struts 配置一起配置。

于 2013-04-27T17:27:13.053 回答