【发布时间】:2013-01-15 07:17:37
【问题描述】:
我想对 AJAX 请求和普通请求以不同方式处理错误。
如何在 Struts2 操作中识别请求是否为 AJAX?
【问题讨论】:
标签: java ajax struts2 http-headers struts-action
我想对 AJAX 请求和普通请求以不同方式处理错误。
如何在 Struts2 操作中识别请求是否为 AJAX?
【问题讨论】:
标签: java ajax struts2 http-headers struts-action
您应该检查请求标头X-Requested-With 是否存在并且等于XMLHttpRequest。
注意并不是所有的AJAX请求都有这个头,例如Struts2 Dojo请求不发送它;如果您使用 Struts2-jQuery(或任何其他新的 AJAX 框架)生成 AJAX 调用,它就在那里。
您可以使用Firebug's Net module...检查它是否存在,例如,当您在 Stack Overflow 上投票时;)
要从Struts2 Action 中检查它,您需要实现ServletRequestAware 接口,然后获取Request 并检查该特定标头是否存在,如下所示:
public class MyAction extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
public void setRequest(HttpServletRequest request) {
this.request = request;
}
public HttpServletRequest getRequest() {
return this.request;
}
public String execute() throws Exception{
boolean ajax = "XMLHttpRequest".equals(
getRequest().getHeader("X-Requested-With"));
if (ajax)
log.debug("This is an AJAX request");
else
log.debug("This is an ordinary request");
return SUCCESS;
}
}
注意,你也可以通过 ActionContext 获取请求,不需要实现 ServletRequestAware 接口,但不是推荐的方式:
HttpServletRequest request = ServletActionContext.getRequest();
【讨论】:
Struts2-Dojo,并且在发送 AJAX 请求时,它不会附加特定的请求标头(“X-Requested-With”)。它不会附加 any 特定的标头,所以如果你使用它,你可以按照其他答案的建议,自己添加一个参数并检查它。
我使用的另一种替代方法是将参数 ajax=true 添加到所有 Ajax url 字符串并使用 isAjax() 方法在我的操作中进行测试。
【讨论】: