基于浏览器的http普通请求与ajax请求

来源:互联网 发布:java接口对于耦合实例 编辑:程序博客网 时间:2024/05/21 14:58

发起一个http请求,可以通过浏览器,也可以通过程序去发起。通过程序去发起http请求(比如java中HttpURLConnection),只要是http层的东西都是能够伪造的,当然大部分还是伪造header头字段。而通过浏览器去发起的http请求(包括ajax请求),一些常用的header字段(比如:referer,User-Agent等)是浏览器帮我们设定的,在网页里面一般我们是没法直接去重置他们的。不过可以通过一些方法间接去重置这些header字段,我了解的主要有如下两种方法:

1.以chrom浏览器为例,通过chrom的插件过滤目的网址,然后对访问这些网址的http请求重置header。参考插件: https://github.com/chenyoufu/modify-http-headers

2.通过代理软件fiddler,重置原始请求的header字段

基于浏览器的http请求分为普通请求和ajax请求,普通请求都是同步执行的,ajax请求可以同步也可以异步(默认异步)。当这两种请求到达服务端时候,我们可以通过x-requested-with这个header字段加以区分。如果是普通请求没有这个header,取到为null。如果是ajax请求,取到是XMLHttpRequest。

因为ajax请求header字段是可以设置的,我们能否重置这个header,伪装成普通请求呢?答案是没法彻底重置的。如果我们自己设置了x-requested-with这个字段,浏览器还是会去再设置一遍这个值。chrom和ie的做法是直接追加,即服务端打印的结果是:自定义的值,XMLHttpRequest。而火狐是直接打印:XMLHttpRequest。

另外如果我们在ajax请求中自行设置referer这个header也是没有效果的,浏览器会直接覆盖你所设置的值。

-----------------------------------------------------------------------------------------------------------------------------------------------------

在一次做非常复杂的ajax应用时,如果一个会话已经超时,但是此时再通过ajax请求,那么ajax返回的则是一个登陆页面的html,那这下就惨了,页面上而已就乱了,那么,能否在java端,如拦截器里判断客户的的请求是否是ajax请求呢,经过查询,能. 
   普通请求与ajax请求的报文头不一样,通过如下 

Java代码  收藏代码
  1. String requestType = request.getHeader("X-Requested-With");  

如果requestType能拿到值,并且值为XMLHttpRequest,表示客户端的请求为异步请求,那自然是ajax请求了,反之如果为null,则是普通的请求 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


AJAX请求和普通HTTP请求区别



两者本质别:
AJAX通xmlHttpRequest象请求服务器服务器接受请求返数据实现刷新交互
普通http请求通httpRequest象请求服务器接受请求返数据需要页面刷新

AJAX请求


普通请求


AJAX请求头会多一个x-requested-with参数,值为XMLHttpRequest
String requestType = request.getHeader("X-Requested-With");  

以此为判断依据


原创粉丝点击