这是我的代码:
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请求。
那么如何处理这种情况?
答案 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();
}