【问题标题】:How to determine whether a request is Ajax or Normal?如何判断一个请求是Ajax还是Normal?
【发布时间】:2013-01-15 07:17:37
【问题描述】:

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

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

【问题讨论】:

    标签: java ajax struts2 http-headers struts-action


    【解决方案1】:

    您应该检查请求标头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 无法获取 XMLHttpRequest?或者更确切地说,上述代码是否适用于所有 ajax 请求?
    • 我在我的一个项目中尝试过使用Struts2-Dojo,并且在发送 AJAX 请求时,它不会附加特定的请求标头(“X-Requested-With”)。它不会附加 any 特定的标头,所以如果你使用它,你可以按照其他答案的建议,自己添加一个参数并检查它。
    • “例如,当你在 Stack Overflow 上投票时;)” 有一段时间很难不屈服于用反对票来测试它的诱惑。
    • @Celos 众所周知,它在支持投票时效果更好;)除了笑话,您对这个答案有真正的疑问吗?
    • @Celos 那么为什么不投票呢?对于 lulz ?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-24
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 2012-04-07
      • 2013-12-11
      • 2013-05-12
      • 1970-01-01
      • 2021-11-17
      相关资源
      最近更新 更多