-1

この struts2 インターセプター クラスは、accessセッション キーをチェックし、ユーザーが実際のページの表示に進むか、エラー メッセージ ページを表示するかを決定します。

この種の値チェックへの最良のアプローチは何ですか?

public String intercept(ActionInvocation invoke) throws Exception {
    Map<String,Object> session = invoke.getInvocationContext().getSession();

    Set<String> access = (Set<String>) session.get("access");
    String action = invoke.getAction().getClass().getSimpleName();

    switch(action) {
        case "ParametersHomeAction":
        case "ErrorMapAction" :
        case "FillerMusicAndLoginAction":
        case "ScheduledAction":
        case "SysConfigAction":
        case "SysParamAction":
            if(access.contains("PAR-FM") ||
               access.contains("PAR-SCHA") ||
               access.contains("PAR-EM") ||
               access.contains("PAR-SYSCNF") ||
               access.contains("PAR-CSAT")) {
                return invoke.invoke();
            } else return RESTRICTED_ERROR;

        case "ProfilesHomeAction":
        case "GroupAction":
        case "UserAction":
            if(access.contains("PFA-U") ||
               access.contains("PFA-G")) {
                return invoke.invoke();
            } else return RESTRICTED_ERROR;

        case "SystemHomeAction":
        case "FunctionAction":
        case "LockUnlockAction":
        case "WfCategoryAction":
        case "WfStatusAction":
            if(access.contains("SYSA-WC") ||
               access.contains("SYSA-WS") ||
               access.contains("SYSA-WT") ||
               access.contains("SYSA-WTU") ||
               access.contains("SYSA-LUU") ||
               access.contains("SYSA-BF")) {
                return invoke.invoke();
            } else return RESTRICTED_ERROR;

        case "ReportsHomeAction":
            if(access.contains("RP-BOAL") ||
               access.contains("RP-PBAL") ||
               access.contains("RP-PBF") ||
               access.contains("RP-PBMT") ||
               access.contains("RP-IVRMU") ||
               access.contains("RP-ACAR") ||
               access.contains("RP-AUR")) {
                return invoke.invoke();
            } else return RESTRICTED_ERROR;

        // TRANSACTIONS TO FOLLOW
        case "HomeAction": invoke.invoke();
        default: return RESTRICTED_ERROR;   
    }
}
4

2 に答える 2

0

配列またはリスト(または複数の配列/リスト)に値を入れて、値がその中にあるかどうかを確認できます。リストの場合:

boolean contains(Object o)
于 2013-10-25T09:12:40.537 に答える
0

定数として必要なアクセス許可にクラスを定義Mapし、初期化ブロックを設定します。

private static final Map<Class<?>, Set<String>> PERMISSIONS = new HashMap<Class<?>, Set<String>>() {{
    Set<String> permissions = new HashSet<String> (Arrays.asList("PAR-FM", "PAR-SCHA", "PAR-EM", "PAR-SYSCNF", "PAR-CSAT"));
    put(ParametersHomeAction.class, permissions);
    put(ErrorMapAction.class, permissions);
    put(FillerMusicAndLoginAction.class, permissions);
    put(ScheduledAction.class, permissions);
    put(SysConfigAction.class, permissions);
    put(ErrorMapAction.class, permissions);
    put(SysParamAction.class, permissions);
    permissions = new HashSet<String> (Arrays.asList("PFA-U", "PFA-G"));
    put(ProfilesHomeAction.class, permissions);
    put(GroupAction.class, permissions);
    put(UserAction.class, permissions);
    permissions = new HashSet<String> (Arrays.asList("SYSA-WC", "SYSA-WS", "SYSA-WT", "SYSA-WTU", "SYSA-LUU", "SYSA-BF"));
    put(SystemHomeAction.class, permissions);
    put(FunctionAction.class, permissions);
    put(LockUnlockAction.class, permissions);
    put(WfCategoryAction.class, permissions);
    put(WfStatusAction.class, permissions);
    permissions = new HashSet<String> (Arrays.asList("RP-BOAL", "RP-PBAL", "RP-PBF", "RP-PBMT", "RP-IVRMU", "RP-ACAR", "RP-AUR"));
    put(ReportsHomeAction.class, permissions);
    permissions = new HashSet<String>(); // special case for no permission required
    put(HomeAction.class, permissions);
}};

次に、このマップを調べると、メソッドは単純になります。

public String intercept(ActionInvocation invoke) throws Exception {
    Map<String, Object> session = invoke.getInvocationContext().getSession();
    Set<String> access = (Set<String>) session.get("access");
    Set<String> permissionSet = PERMISSIONS.get(invoke.getAction().getClass());
    if (permissionSet == null || (!permissionSet.isEmpty() && !access.removeAll(permissionSet)))
        return RESTRICTED_ERROR;
    return invoke.invoke();
}

このコードは、コードと同等の結果を生成します。「力」は次のものに含まれていifます。

  • permissionSet == nullあなたを模倣しますswitch default
  • !permissionSet.isEmpty()要件がないという特別なケースを処理しますHomeAction
  • Set.removeAll()true渡されたセットのすべての要素を削除することによってセットが変更され場合!access.removeAll(permissionSet)true返します。accesspermissionSet
于 2013-10-26T11:44:32.673 に答える