jquery ajax 刷新页面页面无刷新和 session 之间的联系,该怎么处理

发现一个可以改变地址栏,而不导致页面刷新的东东。 Chrome, FF测试通过,不支持IE.
页面的跳转(前进后退,点击等)不重新请求页面
页面URL与页面展现内容一致(符合人们对传统网页的认识)
在不支持的浏览器下降级成传统网页的方式
使用到的API
history.state
当前URL下对应的状态信息。如果当前URL不是通过pushState或者replaceState产生的,那么history.state是null。
history.pushState(state, title, url)
将当前URL和history.state加入到history中,并用新的state和URL替换当前。不会造成页面刷新。
state:与要跳转到的URL对应的状态信息。
title:不知道干啥用,传空字符串就行了。
url:要跳转到的URL地址,不能跨域。
history.replaceState
用新的state和URL替换当前。不会造成页面刷新。
state:与要跳转到的URL对应的状态信息。
title:不知道干啥用,传空字符串就行了。
url:要跳转到的URL地址,不能跨域。
window.onpopstate
history.go和history.back(包括用户按浏览器历史前进后退按钮)触发,并且页面无刷的时候(由于使用pushState修改了history)会触发popstate事件,事件发生时浏览器会从history中取出URL和对应的state对象替换当前的URL和history.state。通过event.state也可以获取history.state。
支持性判断
if ('pushState' in history) {...}
用户通过&点击触发&,&操作历史&,&直接访问URL&的方式修改当前URL。这三种触发方式会使浏览器做出不同的行为。如果页面做无刷跳转,那么页面具体显示什么内容需要js来控制,js则需要根据一些信息来知道当前应该显示什么内容,这个信息就是history.state。这样我们只要保持URL和history.state一一对应,就能保证URL和内容一一对应。大部分情况下URL和history.state都是一一对应的,但通过直接URL访问页面的方式进入页面,history.state是null,所以我们需要把URL转换成对应的history.state写入。我们不能直接写入history.state,需要通过replaceState的方式写入。对于不支持pushstate的浏览器,一律修改href跳转页面,等同于直接访问URL。示意图如下。
原地址链接:&
jquery.history 可以提供更好的兼容性():
用法很简单:
* 替换当前url 并不导致浏览器页面刷新
* name 参数名
* value 参数值
function replaceUrl
(name, value) {
var obj = new Object();
obj[name] =
obj.rand = Math.random();
History.replaceState(obj, '', '?' + name + '=' + value);
阅读(...) 评论()温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(4768)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_084070',
blogTitle:'使用Ajax实现页面无刷新',
blogAbstract:'使用Ajax实现页面无刷新\r\n',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:5,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}jquery异步提交表单,但是session不刷新问题 - ITeye问答
我先问下,大家真的觉得异步那么重要么???
& 我们做一个web项目,需要用jquery异步提交一个表单,然后根据返回值判断是否弹出层,可问题是异步的时候session是不会刷新的,如果
用户不点击 按钮,关闭层,这样用户不会知道自己是什么状态...也想过用iframe隐藏,然后定时刷新,但是这样用户的session就永远不会过期了,希望大家给点意见和办法...谢谢
问题补充:phenom 写道&script&
function callback(param){
根据返回的值你想怎样都行。
}
&/script&
&form target=iframe&
&iframe style=display:none name=iframe/&
form.submit();
--&servlet--&
do something.....
out.print(&script&callback(param)&/script&)
-----------------------
session是我没听懂,还是你没表达清楚是什么东西。
功能我已经实现了,我说的session是说,异步没问题,但是如果session过期了呢,因为页面时不加载的,所以session是不会刷新的
url:"./abcd.action",
dataType:"json",
cache:false,
data:"instance.seqNo="+seqNo,
success:function(json){
&&&&&&&&&&&&&&&&&&& alert(json)
&&&&&&&& }
});
你需要在异步交互的时候跟服务器端交互,刚跟html之类的是不行的。
定时异步请求是可以保持 SESSION的
估计是你代码有点问题吧,敲些日志出来看看
明白你的意思了,不过也只是算法问题。。。
你的弹出式Div值:
& 如果和Session没关系的话。可以不管& 设置个Session过期跳回页面就行了。。。
& 如果有关系,弹出div值的时候,把Session加载出来
虽然听的不是很明白,但还是给点个人建议:
1、使用登录过滤器
2、把用户状态记录到cookie
加一个参数吧 r=Math.random()
$.ajax({&&
& url: 'ajax/test.html?r='+Math.random(),&&
& success: function(data) {&&
&&& $('.result').html(data);&&
&&& alert('Load was performed.');&&
在这里你
你需要了解一下,用AJAX发送请求的时候的状态码。
我想你的那个处理数据的接口肯定可以判断session是否失效吧。
如果失效的话,就抛出异常码,让前端代码捕获,然后处理。
或者如果session失效的话,返回一段前端可以识别的代码。然后再做处理。
这里建议你对你的AJAX接口进行很好的封装。
1.建立前端代码与后台错误的异常代码对照表
2.后台接口建立良好的异常捕捉体系和过滤器
url: 'ajax/test.html',
success: function(data) {
$('.result').html(data);
alert('Load was performed.');
贴出的Jquery封装的ajax接口的一个简单示例,希望对你有所帮助。
怕session过期就最好在客户端写cookie,把用户状态写在客户端,前端js和后端jsp/servlet都能同时操作cookie的,可以实现共享访问,也可以自己设定cookie什么时候失效。
除了定期刷新还有别的方法?
对你所讲的问题,还是不太理解!
以下回答,是我猜你的意思,所做的回答!
一般session里保存用户的登陆信息User对象。
而且,session里的这个对象很少变的。
然而,在你修改这个User对象至数据库之前,先修改session里这个对象!
这样,应该就可以解决问题了吧!
异步和session没什么关系啊
你的意思是不是表单页面很久没动,session已经过期了,用ajax时不能提示用户session已经过期是吗
你只能通过返回值判断,如果不是正确的格式,就认为有异常,提示用户。至于提示用户到底是什么异常,那就有些麻烦了,你需要在每个ajax请求返还值上判断是不是session过期了,其实我觉得没必要判断。
&&& 异步是个双刃剑。将jBPM流程引擎执行部分进行异步处理,可以使客户端的等待时间减少,进而改善用户体验,但同时也会给我们编程带来一定的麻烦。采用异步的好处是,用户在处理流程时只需要在当前线程里处理当前节点的相关内容,流程的其他动作由jBPM的任务调度服务执行。因为任务调度是在后台单独开启一个独立于客户端的线程,所以客户端不用等待流程动作全部处理完成,这样从某种程度上可以减少等待时间。
&&& 但是异步也有其不足,就是我们无法控制事务的完整性。因为流程部分动作的执行和客户端分属两个线程,一旦在jBPM的任务调度服务执行流程时发生异常,客户端不会知道,流程也无法回滚到客户端执行之前的状态。这个不足是显而易见的,会给我们开发带来很多问题。所以在开发基于jBPM的流程时,建议要根据流程的实际情况选择同步或异步。对于那些会影响流程路由和流程完整性的操作,还是要使用同步来完成;而对于那些耗时较长,同时又不会因出错而影响用户操作的流程,可以使用异步来完成。
&&& 对于session的那里没搞清楚是什么意思?
&script&
function callback(param){
根据返回的值你想怎样都行。
}
&/script&
&form target=iframe&
&iframe style=display:none name=iframe/&
form.submit();
--&servlet--&
do something.....
out.print(&script&callback(param)&/script&)
-----------------------
session是我没听懂,还是你没表达清楚是什么东西。
已解决问题
未解决问题> 博客详情
摘要: 在做web页面的时候,为了达到更好的交互效果,往往需要在页面放很多异步请求,和普通的请求一样,这些异步请求也需要处理session过期的问题
& & 做web常常需要考虑session过期的问题,session过期就让页面跳转到登录界面去,但是存在这样一个问题,当页面过期后,用户请求后台的方式有两种:传统方式和异步请求方式,传统方式倒好解决,请求到后台,拦截到过期的操作,直接跳转,但是异步请求不会刷新整个页面,因此对session过期的处理也不能按往常的方式,需要另外的操作。
具体思路:拦截器中判断是否为ajax请求 —— 是ajax请求则返回一个消息 ——页面添加一个全局的ajax处理事件,对消息进行判断,如果是报告session过期,则location到登录页面
第一步,拦截器判断是否为ajax请求:
if(request.getHeader("x-requested-with")!=null
&& request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
//是ajax请求,则返回个消息给前台
PrintWriter printWriter = response.getWriter();
printWriter.print("{sessionState:timeout}");
printWriter.flush();
printWriter.close();
//不是ajax请求,则直接跳转页面
第二步,设置全局ajax处理事件,处理session过期的问题,类似于一个拦截器或者过滤器:
$.ajaxSetup({
contentType:"application/x-www-form-charset=utf-8",
cache:false ,
complete:function(data,TS){
//对返回的数据data做判断,
//session过期的话,就location到一个页面
这是一个基于jQuery的异步处理机制,完整代码我没写,上次在公司写的代码,带不出来,文章里的代码有些还是在网上找来粘进去的,凌晨都过了半小时了,太困了,记录下思路而已。
人打赏支持
码字总数 40909
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥}

我要回帖

更多关于 jquery ajax 刷新页面 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信