开春大礼《华为云技术精选集》大厂100+前沿技术实战分享!>>>
@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
不知道有没有一个好的方法来解决这个问题
这个判读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的逻辑,是页面的逻辑,稍微扩展下基本上就好了。