I am trying to write a interceptor in Struts2 which redirects request to different action based on some condition. My interceptor works fine which is as given below.

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

Struts configuration

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

When ever i call admin action, console output

admin
ErrorPageForLinkAccess

But still its not calling the action ErrorPageForLinkAccess rather calling admin action. Why i am facing this problem?

有帮助吗?

解决方案

You are facing this problem because the action is already resolved and invoked by the dispatcher, so changing the action name in the action context is useless. Struts has done this in filter

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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top