gpt4 book ai didi

redirect - Struts 2如何显示保存在拦截器中的消息,该消息将重定向到另一个操作?

转载 作者:行者123 更新时间:2023-12-02 19:03:37 24 4
gpt4 key购买 nike

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

    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” Action ,如果成功,在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 的接口(interface)。

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 ,但我喜欢能够将我的安全检查封装在他们自己的方法中。

这不依赖于重定向或操作/字段错误(如您的问题中所示),但它应该提供您正在寻找的所有内容。

关于redirect - Struts 2如何显示保存在拦截器中的消息,该消息将重定向到另一个操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4631962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com