Struts2 区分 AJAX 与传统请求

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 或更高版本(之前的版本其包的路径和类名或稍有不同)…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值