Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确定请求是Ajax还是普通请求?_Java_Ajax_Struts2_Http Headers_Struts Action - Fatal编程技术网

Java 如何确定请求是Ajax还是普通请求?

Java 如何确定请求是Ajax还是普通请求?,java,ajax,struts2,http-headers,struts-action,Java,Ajax,Struts2,Http Headers,Struts Action,对于AJAX请求和普通请求,我希望以不同的方式处理错误 如何在Struts2操作中识别请求是否为AJAX?您应该检查请求头X-Requested-With是否存在并且是否等于XMLHttpRequest 请注意,并非所有AJAX请求都有此头,例如Struts2 Dojo请求不发送此头;如果您使用Struts2 jQuery(或任何其他新的AJAX框架)生成AJAX调用,它就在那里 您可以使用Firebug的网络模块检查它是否存在。。。例如,当您对堆栈溢出进行投票时;) 要从Struts2操作中检

对于AJAX请求和普通请求,我希望以不同的方式处理错误


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

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

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


您可以使用Firebug的网络模块检查它是否存在。。。例如,当您对堆栈溢出进行投票时;)

要从
Struts2操作中检查它,您需要实现
ServletRequestAware
接口,然后获取
请求
,并检查该特定头是否存在,如下所示:

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();

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

这是否意味着使用struts2 dojo无法获取XMLHttpRequest?或者更确切地说,上面的代码适用于所有ajax请求吗?我在我的一个项目中使用了
Struts2 Dojo
,在发送ajax请求时,它不会附加特定的请求头(“X-request-With”)。它不会明显地附加任何特定的头。。。因此,如果您正在使用该选项,您可以按照另一个答案的建议,通过自己添加一个参数并检查该选项。“例如,当您对堆栈溢出进行投票时;)”有一段时间,您很难不受诱惑,使用向下投票来测试该选项。@Celos众所周知,使用向上投票时效果更好;)除了笑话,你真的怀疑这个答案吗?@Celos那么为什么不投票呢?为了休息?