字节跳动 hash 微信小程序 分布式 aircrack-ng mobile Seajs vue学习教程 vue教学视频 bootstrap侧边栏 录音棚设备一套多少钱 art神经网络 mysql重新初始化 python程序界面 hbase集群搭建 java手机验证码 python转java python操作mongodb python函数参数 python代码 python函数大全 java在线学习 java泛型 java中的基本数据类型 java常用数据结构 html5网页制作 tt语音官网 电脑书籍下载 ps3d字体 完美漂移辅助 python求和 抠图教程 计算机科学概论 回收站在哪个盘 vs2017密钥 日志软件 机箱最佳风道图 ssh框架原理及流程 cad圆形变成多边形 kz文件怎么打开
当前位置: 首页 > 学习教程  > 编程语言

如何判断一个请求是否是Ajax异步请求

2020/9/19 15:28:41 文章标签:

前言

今天在看项目过程中,发现了一段代码。是用来判断一个请求是否是ajax请求,出于好奇,我研究了一番。

代码预览

    /**
     * 是否是Ajax异步请求
     * 
     * @param request
     */
    public static boolean isAjaxRequest(HttpServletRequest request)
    {
        String accept = request.getHeader("accept");
        if (accept != null && accept.indexOf("application/json") != -1)
        {
            return true;
        }

        String xRequestedWith = request.getHeader("X-Requested-With");
        if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1)
        {
            return true;
        }

        String uri = request.getRequestURI();
        if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml"))
        {
            return true;
        }

        String ajax = request.getParameter("__ajax");
        if (StringUtils.inStringIgnoreCase(ajax, "json", "xml"))
        {
            return true;
        }
        return false;
    }

从代码中可以看出主要从四方面校验一个请求是否是ajax请求。这里主要说一下前两个方面。

测试

Accept

Accept 请求头用来告知(服务器)客户端可以处理的内容类型,这种内容类型用MIME类型来表示。借助内容协商机制, 服务器可以从诸多备选项中选择一项进行应用,并使用 Content-Type 应答头通知客户端它的选择。浏览器会基于请求的上下文来为这个请求头设置合适的值,比如获取一个CSS层叠样式表时值与获取图片、视频或脚本文件时的值是不同的。

模拟测试

下面我模拟两种请求:

浏览器访问:

ajax访问:

通过对比,我们发现在请求头中的确存在代码中用于判断是否是ajax请求的请求头,故方法可行。

不同声音

在慎用X-Requested-With判断是否是Ajax请求这篇文章中,作者提出,jQuery.ajax在跨越请求下,默认不会设置X-Requested-With头。

进行到这里,为什么ajax请求会自动带上X-Requested-With头?,为什么跨越之后,X-Requested-With会丢失?

很庆幸,我在CSRF Mitigation for AJAX Requests这篇文章中找到了答案,文中提到许多JavaScript框架(例如JQuery)会自动将此标头与任何AJAX请求一起发送。此标头不能跨域发送,主要目的是为了防止CSRF攻击。文章写的很详细,大家可以翻墙看看,这里就不粘贴过来了。

结论

经过上面的讨论,我们可以利用acceptX-Requested-With头信息来做判断。虽然大部分JavaScript框架会自动加上X-Requested-With,特殊情况下,还是需要自定义标头。


本文链接: http://www.dtmao.cc/news_show_200259.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?