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-
如果您需要更多帮助,请告诉我。您是否正在寻找一种机制,以便在用户试图调用其无权访问的操作时向其显示消息?是的,我想告诉用户他无权访问。