2011-01-08 66 views
3

在我的攔截器,如果用戶沒有足夠的權利,將有一個警告消息:Struts 2如何顯示保存在攔截器中的消息,該攔截器會重新導向到另一個動作?

public String intercept(ActionInvocation invocation) throws Exception { 

    ActionContext actionContext = invocation.getInvocationContext(); 
    Map<String, Object> sessionMap = actionContext.getSession(); 
    User loginUser = (User) sessionMap.get("user"); 

    Object action = invocation.getAction(); 

    if (loginUser != null && loginUser.getRole().getId() != Constant.AUTHORITY_ADMIN) { 

     ((ValidationAware) action).addFieldError("user.authority", 
       ((DefaultAction) action).getText("user.action.authority.not.enough")); 

     return DefaultAction.HOME_PAGE; 
    } 

    return invocation.invoke(); 
} 

然後,它會重定向到「HOME_PAGE」動作,如果成功,顯示在jsp信息。那麼如何顯示警告消息?

我用了兩個攔截器strust.xml的ConfigEd,對於管理權需求量的:

  <interceptor-stack name="authorityStack"> 
      <interceptor-ref name="authority" /> 
      <interceptor-ref name="defaultStack" /> 
      <interceptor-ref name="store"> 
       <param name="operationMode">STORE</param> 
      </interceptor-ref> 
     </interceptor-stack> 

默認爲:

<interceptor-stack name="default"> 
      <interceptor-ref name="login" /> 
      <interceptor-ref name="defaultStack" /> 
      <interceptor-ref name="store"> 
       <param name="operationMode">AUTOMATIC</param> 
      </interceptor-ref> 
     </interceptor-stack> 
+0

如果用戶試圖調用他們無權訪問的操作,你只是想找一種機制向用戶顯示一條消息? – 2011-01-08 02:53:36

回答

3

這裏是我如何處理Struts2的訪問控制。它非常容易且可重複使用:

首先,創建一個名爲SecurityCheckAware的接口。

public interface SecurityCheckAware { 
    void checkRight(); 
} 

然後,創建一個名爲SecurityCheckInterceptor的攔截器。

public class SecurityCheckInterceptor extends AbstractInterceptor { 
    @Override 
    public String intercept(final ActionInvocation invocation) throws Exception { 
     if (invocation.getAction() instanceof SecurityCheckAware) { 
      SecurityCheckAware action = (SecurityCheckAware) invocation.getAction(); 
      action.checkRight(); 
     } 

     return invocation.invoke(); 
    } 
} 

然後,在堆棧中定義攔截器。

任何要執行安全檢查的操作都應該執行SecurityCheckAware。例如:

@Override 
public void checkRight() { 
    User loginUser = (User) session.get("user"); 
    if (loginUser != null && loginUser.getRole().getId() != Constant.AUTHORITY_ADMIN) { 
     throw new AccessViolation("You do not have permission to access this page."); 
    } 
} 

接下來,創建一個擴展RuntimeException(或其某個子類)的自定義異常。我稱之爲AccessViolation

最後,圖AccessViolation到一個錯誤頁面在struts.xml中,如:

<global-results> 
    <result name="accessDenied">/WEB-INF/jsp/accessDenied.jsp</result> 
</global-results> 

<global-exception-mappings> 
    <exception-mapping exception="com.example.AccessViolation" result="accessDenied"/> 
</global-exception-mappings> 

注意:您可以前後方向走SecurityCheckAwareSecurityCheckInterceptor,只是利用現有的PreparablePrepareInterceptor,但我就像能夠用他們自己的方法封裝我的安全檢查一樣。

這不依賴於重定向或動作/字段錯誤(如在你的問題),但它應該提供你正在尋找的一切。