7

我使用了 Struts 2 框架,并创建了一个具有登录页面的 Web 应用程序。我有三个不同的Action类,分别命名为Action1Action2Action3和 JSP 页面的不同视图,这些视图是通过在类中运行一些业务逻辑来呈现的Action

现在,我想在Action类执行处理之前检查用户是否已登录。所以,

我在下面创建了一个可以正常工作的拦截器:

public String intercept(ActionInvocation invocation) throws Exception 
{
    HttpServletRequest  request  = ServletActionContext.getRequest();
    HttpServletResponse response = ServletActionContext.getResponse();
    HttpSession         session  = request.getSession();
    
    if(session.isNew())
    {
        response.sendRedirect("Login.action");
    }
    
    System.out.println("Interceptor Fired");
    String result = invocation.invoke();
    return result;
}

我想要struts.xml的不是为下面的所有操作添加拦截器

<interceptor-ref name="newStack"/>

我的struts.xml文件有:

<package name="default" extends="struts-default">       
   <interceptors>   
    <interceptor name="printMsgInterceptor" class="LoginInterceptor"></interceptor>
         <interceptor-stack name="newStack">
        <interceptor-ref name="printMsgInterceptor"/>
        <interceptor-ref name="defaultStack" />
         </interceptor-stack>
     </interceptors>

    <action name="actone" class="Action1">
      <result name="success">/success.jsp</result>
      <interceptor-ref name="newStack"/>
    </action>
        <action name="acttwo" class="Action2">
      <result name="success">/success.jsp</result>
      <interceptor-ref name="newStack"/>
    </action>
         <action name="actthree" class="Action3">
      <result name="success">/success.jsp</result>
      <interceptor-ref name="newStack"/>
    </action>
    </package>

对于每个动作,我都想写一些定义struts.xml来运行拦截器而不是手动添加

<interceptor-ref name="newStack"/> 
4

2 回答 2

13
<interceptor name="test" class="Full path for LoginInterceptor" />

    <interceptor-stack name="testStack">  
         <interceptor-ref name="test"/>
         <interceptor-ref name="defaultStack"/> //here you are including default stack
    </interceptor-stack> 

</interceptors>  
<default-interceptor-ref name="testStack"></default-interceptor-ref>

现在 testStack将为每个请求执行

于 2013-06-05T12:43:06.837 回答
5

采用

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

如果您不interceptor-ref为每个操作手动放置,您可以使用default-interceptor-ref拦截所有未明确定义拦截器配置的操作。请参阅我们如何配置要与每个 Action 一起使用的拦截器

我们可以创建自己的命名堆栈,甚至可以为包声明一个新的默认拦截器堆栈

<package name="default" extends="struts-default" >
  <interceptors>
       <interceptor-stack name="myStack">
          <interceptor-ref name="timer"/>
          <interceptor-ref name="logger"/>
        <interceptor-ref name="defaultStack"/>
       </interceptor-stack>
  </interceptors>

但是,如果您说上面的拦截器工作正常,我会鼓励您对业务逻辑保持谨慎,即如果登录操作在第一次执行时失败,则不会执行登录操作。您应该检查经过身份验证的用户的结果并将这些结果保存在您可以在拦截器中检查的会话中,而不是检查新会话。例如看这个问题。

编写使用经过身份验证的用户信息与会话的拦截器的示例,您可以在此处找到。

于 2013-06-05T12:44:41.457 回答