Struts 2, как отобразить сообщения, сохраненные в перехватчике, которые будут перенаправлены на другое действие? - PullRequest
3 голосов
/ 08 января 2011

в моем перехватчике, если у пользователя недостаточно прав, будет выдано предупреждающее сообщение:

    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, для требования прав администратора:

            <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>

Ответы [ 2 ]

3 голосов
/ 08 января 2011

Вот как я управляю контролем доступа в 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>

Примечание. Вы можете заранее использовать SecurityCheckAware и SecurityCheckInterceptor и просто использовать существующие Preparable и PrepareInterceptor, но мне нравится иметь возможность инкапсулировать мои проверки безопасности их собственным методом.

Это не зависит от перенаправления или ошибок действия / поля (как в вашем вопросе), но должно доставить все, что вы ищете.

1 голос
/ 17 апреля 2013

Я использую MessageStoreInterceptor, и это легко.

MessageStoreInterceptor - http://struts.apache.org/release/2.3.x/docs/message-store-interceptor.html

Дайте мне знать, если вам нужна дополнительная помощь.

...