Redirect Struts 2如何显示保存在拦截器中的消息,从而重新记录到另一个操作?

Redirect Struts 2如何显示保存在拦截器中的消息,从而重新记录到另一个操作?,redirect,struts2,action,message,interceptor,Redirect,Struts2,Action,Message,Interceptor,在我的拦截器中,如果用户没有足够的权限,将出现一条警告消息: public String intercept(ActionInvocation invocation) throws Exception { ActionContext actionContext = invocation.getInvocationContext(); Map<String, Object> sessionMap = actionContext.getSession();

在我的拦截器中,如果用户没有足够的权限,将出现一条警告消息:

    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();
}
publicstringintercept(ActionInvocation调用)引发异常{
ActionContext ActionContext=invocation.getInvocationContext();
Map sessionMap=actionContext.getSession();
用户登录用户=(用户)sessionMap.get(“用户”);
Object action=invocation.getAction();
if(loginUser!=null&&loginUser.getRole().getId()!=Constant.AUTHORITY\u ADMIN){
((ValidationAware)操作).addFieldError(“user.authority”,
((DefaultAction)action.getText(“user.action.authority.not.ough”);
返回DefaultAction.HOME_页面;
}
返回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>

自动的

以下是我在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(或其某些子类)的自定义异常。我称之为
access违规

最后,将
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>

/WEB-INF/jsp/accessDenied.jsp
注意:您可以先使用
SecurityCheckAware
SecurityCheckInterceptor
,然后只使用现有的
Preparable
PrepareInterceptor
,但我喜欢能够用它们自己的方法封装我的安全检查


这不依赖于重定向或操作/字段错误(如您的问题所述),但它应该提供您所寻找的一切。

我使用MessageStoreInterceptor,它很简单

MessageStoreInterceptor-


如果您需要更多帮助,请告诉我。

您是否正在寻找一种机制,以便在用户试图调用其无权访问的操作时向其显示消息?是的,我想告诉用户他无权访问。