我正在尝试在Struts2中编写一个拦截器,该拦截器会根据某些条件将请求重定向到其他操作。我的拦截器工作正常,如下所示。

public String intercept(ActionInvocation actionInvocation) throws Exception {
        ActionContext actionContext=actionInvocation.getInvocationContext();
        String actionName=actionContext.getName();
        String actionResult=null;
        if(actionName.equals("admin"))
        {
            System.out.println("admin");
            //if(based on some condition)
            actionContext.setName("ErrorPageForLinkAccess");
                    System.out.println(actionContext.getName());
        }
        actionResult = actionInvocation.invoke();
        return  actionResult;
    }


支撑配置

<action name="other">
<result>Jsp/other.jsp</result>
</action>
<action name="admin" class="com.example.Admin" method="adminDemo">
<result name="success">Jsp/admin.jsp</result>
</action>
<action name="ErrorPageForLinkAccess">
    <result name="success">Jsp/ErrorPageForLinkAccess.jsp</result>
</action>


每当我打电话给管理员操作时,控制台输出

admin
ErrorPageForLinkAccess


但是仍然不调用动作ErrorPageForLinkAccess而是调用admin动作。
为什么我要面对这个问题?

最佳答案

您正面临此问题,因为该操作已由调度程序解决并调用,因此在操作上下文中更改操作名称是无用的。 Struts已在过滤器中完成此操作

ActionMapping mapping = prepare.findActionMapping(request, response, true);
if (mapping == null) {
    boolean handled = execute.executeStaticResourceRequest(request, response);
    if (!handled) {
        chain.doFilter(request, response);
    }
} else {
    execute.executeAction(request, response, mapping);
}

关于java - Struts2 ActionContext setName方法不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22148006/

10-11 09:23