9

我想以不同的方式处理 AJAX 请求和普通请求的错误。

如何在 Struts2 操作中识别请求是否为 AJAX?

4

2 回答 2

25

您应该检查请求标头X-Requested-With是否存在并且等于XMLHttpRequest.

请注意,并非所有 AJAX 请求都有此标头,例如Struts2 Dojo请求不发送它;如果您使用Struts2-jQuery(或使用任何其他新的 AJAX 框架)生成 AJAX 调用,它就在那里。

您可以使用Firebug's Net module...检查它是否存在,例如,当您对 Stack Overflow 进行投票时;)

要从 a 中检查它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();
于 2013-01-31T10:53:19.557 回答
3

我使用的另一种选择是将参数 ajax=true 添加到所有 Ajax url 字符串并使用 isAjax() 方法在我的操作中进行测试。

于 2013-01-31T14:43:54.010 回答