拦截器中的连锁动作

时间:2014-11-24 16:27:43

标签: java struts2 get interceptor chaining

这是我的代码:

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.StrutsStatics;

@SuppressWarnings("serial")
public class PostOnlyInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation ai) throws Exception {
        final ActionContext context = ai.getInvocationContext();
        HttpServletRequest request = (HttpServletRequest) context.get(StrutsStatics.HTTP_REQUEST);
        if (!request.getMethod().equals("POST")) {
            return Action.ERROR;
        }

        return ai.invoke();

    }
}

我正在使用这个拦截器来避免' GET'方法请求出于安全原因。但是当我通过使用链动作方法调用它时:request.getMethod()返回GET请求。

那么如何处理这种情况?

1 个答案:

答案 0 :(得分:0)

谨防行动链,that is discouraged

  

通常,不建议使用Action Chaining。首先探索其他选项,例如After Post After Post技术。

但是如果您已经使用它并且无法更改,则可以通过检查结果是否为chain类型来绕过拦截器中的POST检查:

public String intercept(ActionInvocation ai) throws Exception {
    final ActionContext context = ai.getInvocationContext();
    HttpServletRequest request = (HttpServletRequest) 
                                  context.get(StrutsStatics.HTTP_REQUEST);

    boolean isChainResult = ai.getResult() != null 
          && ActionChainResult.class.isAssignableFrom(ai.getResult().getClass());

    if (!request.getMethod().equals("POST") && !isChainResult) {
        return Action.ERROR;
    }

    return ai.invoke();

}