jfinal中ajax操作session超时后重新登录后想进入上次的操作页面

错觉 发布于 2016/04/25 19:37
阅读 358
收藏 1

@JFinal 你好,想跟你请教个问题:

呵呵,其实这个问题也不是jfinal相关的啦,呵呵,就是以最佳的用户体验为前提,ajax操作如果session超时后,用户重新登录成功后应该进入上次的ajax操作所在的页面而不是简单粗暴的进入网站首页

我目前想到2个方案:

方案1: 永不超时

在用redis做session后,其实就是在redis里面存一条没有timeout记录,没啥资源消耗,除非用户在进行ajax操作前,手动清除了浏览器缓存,否则这个session超时问题永远也不会出现

但是如果不用redis存session呢,那就是占用tomcat的jvm的内存了,也不好做集群,所以永不超时不适合这个场景

方案2:有超时时间

ajax操作遇到session超时后,用户重新登录后,跳转到该操作的所在页面,也就是header中的referer,因为你得先进入一个页面才能点击页面上的ajax链接,这里存在的问题就是在过滤器中获取header的referer是可以获取到的,但是如果之前这个页面带参数就没办法了,因为referer中不会有参数,那么在登录成功后就跳转不回去了,

例如:

ajax操作所在的页面为:/ask?type=law ,当执行该页面上的ajax操作后,过滤器中获取到的referer其实是http://localhost:8080/myproject/ask,后面的参数没法获取,所以登录成功后就跳转不回去了。

但是如果jfinal支持真正的restful,那么这个问题完全可以解决,比如ajax操作所在的页面为/ask/law,那么调用ajax操作在过滤器中获取到的referer就是/ask/law

不知道有没有一个好的方法来解决这个问题

加载中
0
如梦技术
如梦技术
写个拦截器,按照你的思路去实现就好了,拦截器里把ajax判断好
String requestType = request.getHeader("X-Requested-With");

这个判读ajax请求不够准确,也有的ajax不是返回json的,可能是返回的html片段,你可以加一个注解如:@AjaxBody在拦截器里判读下!

这种session超时的统一renderJson一个error,然后js统一判断跳转就好了(可以自己基于ajax封装)。js跳转的时候把页面路径作为一个参数带过去,此处切记要urlEncode,get会自动解一次,有的参数需要多次encode。另外的话,也可以在拦截器里直接把它们储存到cookie或者redis。参数和缓存各有各的优缺点,你踩坑了就知道了。

然后就是改登陆的ajax和页面的了,判断有这个参数的就跳回去。

http://git.oschina.net/596392912/JFinal2.0-beetl-training/blob/master/src/main/java/net/dreamlu/interceptor/AdminInterceptor.java

我这里面没加ajax的逻辑,是页面的逻辑,稍微扩展下基本上就好了。



如梦技术
如梦技术
nonono,我说的是在js里面跳转,就是当前页面,完全可以拿到所有参数
错觉
错觉
哥们还是你最热心,你没理解我意思,我要跳转ajax这个url所在的页面,而不是ajax这个url本身,要获取ajax这个url所在的页面,我是希望用referer,但是带参数情况就获取不到了
返回顶部
顶部