1.X-Requested-With 与 XMLHttpRequest
提起 AJAX,大部分人的第一反应:这是在 JQuery 中常用到的。而在 JQuery 的 -ajax 请求(包括其衍生的请求方式,如 -get、-post 等)中,我们会发现在其请求标头中含有一对
X-Requested-With: XMLHttpRequest
的键值对,而这个键值对表明了这是 ajax 类型的请求。
而为什么值为XMLHttpRequest
就代表是 -ajax 请求呢?这是一个不成文的规定,用的人多了也就成为一条通用的协议。AJAX 技术的核心就是 XMLHttpRequest 对象,简称 XHR;最早由微软在 IE5 中引入的一个特性,随后其他浏览器厂商也先后提供类似的实现。而现在我们常用的 JQuery 等 JS 库也是将 XHR 进行了封装。
2.Struts2识别AJAX请求
在 Struts2 中,通常我们需要判断请求的来源是 AJAX 请求还是传统请求,以提升用户体验。很多初学者会提出这样一个问题:“获取 JSON 格式的 AJAX 请求中的返回结果是一个页面的源码,怎么处理?”。这个时候就需要对请求进行识别,该返回 JSON 数据还是一个页面。
一般在后台,这个标头可以从HttpServletRequest
中获取。Struts2 中也是在拦截器等地方进行过封装,但基本都可以通过以下方式进行判断:
import javax.servlet.http.HttpServletRequest;
// 注意 Strut 2.5 的包路径
import org.apache.struts2.StrutsStatics;
import com.opensymphony.xwork2.ActionInvocation;
import org.apache.struts2.ServletActionContext;
// 省略其他代码,以下仅给出方法代码
/*
* 返回 true 如果是一个 AJAX 请求
*/
public static boolean isFromAjax(HttpServletRequest request) {
return "XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With"));
}
/*
* 其中 StrutsStatics.HTTP_REQUEST 的值为:
* "com.opensymphony.xwork2.dispatcher.HttpServletRequest"
*/
public static boolean isFromAjax(ActionInvocation ai) {
ActionContext context = ai.getInvocationContext();
return isFromAjax((HttpServletRequest) context.get(StrutsStatics.HTTP_REQUEST));
}
public static boolean isFromAjax() {
return isFromAjax(ServletActionContext.getRequest());
}
注: 示例方法代码适用于在 Struts 2.5 或更高版本(之前的版本其包的路径和类名或稍有不同)…