`

Ajax,防止重复请求,跨域,本地存贮

阅读更多
原帖地址:http://www.cnblogs.com/bgcolor/archive/2013/05/31/Ajax_localStorage_jsonp.html

Ajax请求,一般都在点击事件下发生的


问题:如果用户点击频率过快,一瞬间点个n次,那就会向服务器要发送n次请求,如何解决!


从前端方面来看,既然是点击发送Ajax请求,那就设置个等待时间,进行第二次请求发送,即setTimeout(),方法,还需要有个标致位,可以是全局变量,隐藏欲表单值,禁用Button按钮,解除绑定点击事件,(这几个方法个其实是一样)


后端脚本b.php



<?php
$arr=array('title'=>'1','content'=>'内容');
echo json_encode($arr);


前端脚本a.html



<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>A</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
<script type="text/javascript" charset="utf-8">
$(
function(){
//设置全局变量
var a=true;
$(
'a').click(function(){
if(a==true){//判断是否为真,为真就继续执行
a=false;//点击后,设置为假
$.getJSON('b.php',function(d){
$(
"#name").append(d.title+"<br />");
//过500毫秒设置为真
setTimeout(function(){
a
=true;
},
500);
});
}
});
})
</script>
</head>
<body>
<a href="b.php" onclick="return false;">example</a>
<br>
<br>
<br>
<br>
<br>
<div id="name" style="width:100px;height:50px;border:1px solid gray;"></div>
</body>
</html>


通过禁用按钮来控制提交频率



<input type="button" id="bt" value="提交">
<div id="name" style="width:200px;height:500px;border:1px solid gray;"></div>
<script type="text/javascript" charset="utf-8">
$(
'#bt').click(function(){
//点击后就设置按钮为禁止状态
$('#bt').attr('disabled','disabled');
$(
'#bt').val('提交中...');
$.getJSON(
'b.php',function(d){
$(
'#name').append(d.content);
//设置500毫秒,将按钮恢复
setTimeout(function(){
$(
'#bt').removeAttr('disabled');
},
500);
});
});
</script>

通过隐藏域值来控制提交频率
<input type="hidden" id='hid' value=1 />
<a href="javascript:void(0);">点击</a>
<div id="name" style="width:200px;height:500px;border:1px solid gray;"></div>
<script type="text/javascript" charset="utf-8">
$(
'a').click(function(){
if($('#hid').val()==1){
$(
'#hid').val(0);
$.getJSON(
'b.php',function(d){
$(
'#name').append(d.content);
//设置500毫秒,将将隐藏域值改为1
setTimeout(function(){
$(
'#hid').val(1);
},
1000);
});
}
});
</script>


网上看了JQuery的abort()方法,虽然取消中断了,但还是会去访问服务器,


还有就是把Ajax异步改成同步$.ajaxSettings.async = false;
后端方面考虑过cookie,session,MySQL,比较两次时间差,来控制请求频率,但没弄出来,网上看了,大多是在Apache/Nginx等Web服务器修改配置文件即可


HTML5有本地存贮功能,主流浏览器都支持,可以将服务器返回的数据,存在本地,下去请求直接在本地找,和后台Memcache,操作一样



<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Local</title>
</head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
<body>
<p><input type="button" name="some_name" id="bt" value="点击"></p>
<div id="name" style="width:200px;height:320px;border:1px solid gray"></div>
<script type="text/javascript" charset="utf-8">
$(
'#bt').click(function(){
var local=window.localStorage;//初始化本地存储
var key='t9';//设置键
var url='data.php';//请求数据地址
var val=local.getItem(key);//得到数据
if (!val) {
$.ajaxSettings.async
= false;//必须Ajax设置同步,因为异步回调函数返回值无法return
$.get(url,function(d){
val
=d;
local.setItem(key,val);
});
}
j
=eval("("+val+")");//解析json字串
$("#name").append(j.title+"|"+j.content+"<br>");
});
</script>
</body>
</html>


data.php



<?php
echo json_encode(array('title'=>'标题','content'=>'内容'));


 


打开Chrome,F12查看


一:页面初始状态


   


二:第一次点击,页面请求了data.php



三:本地存贮



四:已经不请求data.php了



Ajax跨域,能不能跨域还得看服务器是否把数据返回在回调函数内


server.php



<?php
$arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
$result=json_encode($arr);
//动态执行回调函数
$callback=$_GET['call'];
//将结果放在?( )返回
echo $callback."($result)";


f.html



<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>xxx</title>
<style type="text/css">

</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js "></script>
<script type="text/javascript">
$(
function(){
$(
'a').click(function(){
$
.getJSON("server.php?call=?",
function(result) {
for(var i in result) {
alert(i
+":"+result[i]);//循环输出a:1,b:2,
}
});
});
});
</script>
</head>
<body>
<a href="javascript:void(0)">example</a>
</body>
</html>


 

本文链接

分享到:
评论

相关推荐

    Spring Boot Redis Session 共享(Ajax 跨域)

    - `demo2`可能是对`demo1`的扩展,增加了CORS配置,允许跨域的Ajax请求访问服务端资源。 总结,通过Spring Boot结合Redis,我们可以实现高效的分布式Session共享,确保用户会话在多服务器环境下的一致性。同时,...

    ajax跨域懒加载图片

    Ajax请求这个文件,获取所有需要加载的图片URL。JSON格式便于数据传输和解析,是常见的API返回格式。 实现步骤大致如下: 1. 在`index.html`中设置图片元素,并将真实的URL存入`data-src`。 2. 在`imageurl.js`中...

    浅谈Ajax跨域Session和跨域访问

    跨域请求指的是,当一个Ajax请求的发起域和目标响应域不一致时,就会构成跨域。这种情况下,由于浏览器同源策略的限制,直接的请求会因为安全问题而被阻止。为了绕过这个限制,我们可以使用JSONP(JSON with Padding...

    ajax+webservice跨域实现文件上传

    在具体实现过程中,前端可能使用XMLHttpRequest或更现代的Fetch API发起Ajax请求,同时设置`withCredentials`属性以携带Cookie进行身份验证。后端的Web服务接收到请求后,需要解析文件数据,进行存储或处理,并返回...

    js跨域解决方案

    6. **Window.name与Location.hash**:通过将数据存储在`window.name`属性或URL的hash部分,可以在不同的页面之间传递数据,实现一定程度的跨域。 7. ** CORS-Policy Image**:对于图片资源,可以通过设置图片的`...

    ajax发送xml请求小示例

    1. **跨域问题**:默认情况下,AJAX请求受到同源策略限制。可以通过CORS(Cross-Origin Resource Sharing)或其他技术解决跨域问题。 2. **缓存控制**:可以设置HTTP头来决定是否缓存请求,以优化性能。 3. **错误...

    ajax跨域访问遇到的问题及解决方案

    然而,随着互联网服务的多样化,开发者常常需要通过Ajax请求获取其他域上的数据,这就产生了跨域需求。 **遇到的问题:** 1. **安全限制**:浏览器基于同源策略,阻止了Ajax对非同源URL的请求。 2. **Session丢失**...

    跨域问题详解

    3. **AJAX请求不能发送**:非同源的AJAX请求将被禁止,这意味着JavaScript无法通过XMLHttpRequest对象向非同源服务器发送请求。 尽管这些限制是出于安全考虑,但在某些场景下也会带来不便,比如合理的跨域数据交换...

    AJAX跨域问题[整理].pdf

    当需要从不同源获取数据时,AJAX请求会受到限制,导致跨域请求失败。为了克服这一限制,开发人员采用了多种技术,其中最常见的是JSONP(JSON with Padding)和Pjax(Push State + AJAX)。 1. JSONP: JSONP是一种...

    ajax上传图片,PHP上传图片,PHP上传图片跨域,跨域上传图片,上传图片缩览图

    最后,创建图片缩览图通常是为了优化显示和节省服务器存储空间。在PHP中,我们可以使用GD库或者Imagick扩展来处理图片缩放。下面是一个使用GD库生成缩略图的例子: ```php $source_image = imagecreatefromjpeg($...

    JS跨域访问解决方案总结

    这样,前端的AJAX请求可以发送到本地服务器,本地服务器再将请求转发到实际的API服务器。 4. **IFrame跨域通信**:利用HTML5的`window.postMessage` API,不同源的页面可以通过嵌入的IFrame进行通信。这种方式可以...

    跨域获取其他网站rss信息

    对于跨域的AJAX请求,需要在服务器端配置允许跨域,客户端使用`jQuery.ajax`或`fetch` API发送请求。 4. **RSS解析**:获取RSS信息后,需要解析XML结构。在.NET环境中,可以使用`System.Xml`命名空间的类,如`Xml...

    完美解决iframe跨域问题

    2. **利用`window.name`**:`window.name`属性在页面刷新或跳转后仍然保持不变,可以作为跨域数据存储的载体。当一个页面设置`window.name`,然后在另一个页面的iframe中加载这个页面,就可以读取到之前设置的值。 ...

    PHP AJAX 实现跨域保存数据的问题(网页留言表单提交数据的问题).rar

    使用JavaScript(通常配合jQuery库)可以创建AJAX请求来提交表单数据: ```javascript $.ajax({ type: 'POST', // 或者 'GET' url: 'your-php-script.php', // PHP处理脚本 data: $('#your-form').serialize(), ...

    ajax输入框提示集合

    6. **跨域请求**:如果Ajax请求的目标URL不在同一个域名下,需要考虑跨域资源共享(CORS)策略。 7. **前端框架集成**:如今许多现代Web应用使用React、Vue或Angular等前端框架,这些框架都有内置的Ajax库(如axios...

    AJAX省市级联

    9. **性能优化**:为了提高用户体验,可以采用缓存策略,如在初次请求省份数据时存储,之后再次选择同一省份时直接从本地缓存中读取,避免重复请求。 10. **安全性考虑**:在处理用户输入和数据传输时,必须注意...

    spring security ajax请求与html共存

    当Ajax请求被拒绝时,Spring Security默认会重定向到一个错误页面,但这对Ajax请求并不适用。因此,我们需要提供一个错误处理器,将错误信息作为JSON或其他适合Ajax响应的格式返回。 5. **HTML与Ajax共存** 在...

    ie7下利用ajax跨域盗取cookie的解决办法

    通过编写ASP脚本作为代理,可以接受AJAX请求,然后服务器向目标域发起请求,并将结果返回给AJAX调用者。这种方法的优点是可以绕过浏览器的同源策略限制,但缺点是需要在服务器上部署代理脚本。 然而,在跨域操作中...

    jsonp跨域请求数据实现手机号码查询实例分析.docx

    - **发起请求**:使用jQuery的`$.ajax`方法发送GET请求,并设置`dataType`为`"jsonp"`以支持JSONP方式的跨域请求。 - **参数设置**:URL中包含待查询的电话号码,并指定`jsonp`参数为`callback`,这是服务器端期望...

Global site tag (gtag.js) - Google Analytics