jfinal拦截器拦截不了ajax请求?

请问一下,我再项目重配置了一个全局拦截器,一般方法都是执行之前可以先进入拦截器拦截的,但是好像ajax请求的方法没有先进入拦截器而是先执行方法再进入拦截器的,这是什么原因呢?以下贴出拦截器部分代码:

blob.png

忘了贴出ajax请求的前台方法:

blob.png

评论区

jinyuanyuanab

2016-10-20 16:03

问题已解决,我把inv.invoke();这句话放在拦截器的最后执行就可以先进入拦截器了。但是问题来了,我在拦截器中执行c.redirect(DLBConfig.CPATH+"login/login.html");想要重定向到登陆界面,这句话执行到了但是并没有跳到登陆方法login(),而是继续执行被拦截的方法,请问这是什么原因?

jinyuanyuanab

2016-10-20 16:29

inv.invoke();似乎是因为这句话,只要执行了这句,拦截器中下面的方法就会不执行,而是直接执行被拦截的方法,不管拦截器重是否重定向。求解?

JFinal

2016-10-20 16:47

如果你希望不执行 action,就在分支语句中不去调用 inv.invoke(),如果希望调用到达 action,就调用一下 inv.invoke(),没有什么其它诀窍,让程序根据这个逻辑走就可以了

jinyuanyuanab

2016-10-20 16:49

@JFinal波哥好,以上问题已找到解决方法,现请教一个问题,拦截器中对post请求重定向,redirect 和render都不行,只能renderText(),但是这样实现不了页面跳转。

jinyuanyuanab

2016-10-20 16:50

@JFinal 是的,已经按照这个逻辑改了,但是怎样对ajax请求重定向呢?redirect 和render都不行。

JFinal

2016-10-20 16:57

@jinyuanyuanab 重定向是服务端向浏览器发回一个 url,告知浏览器拿着这个 url 重新发起一个 http 请求,所以地址栏里面的 url 会改变

而 ajax 是一个异步请求,只能是机械式地获取服务端数据,并不会对重定向返回内容做特殊处理,所以 ajax 天然不能与重定向在一起说事

正确的做法是,要么不使用 ajax ,后端做重向向才有意义,要么使用 ajax,服务端返回一个 json 例如 {"url", "http://xxx.yyy.com"},ajax 拿到数据以后,再 location = data.url; 进行跳转

首先要把概念搞清楚,重定向天生不能与ajax 在一起使用

JFinal

2016-10-20 17:00

ajax 只是机械化的拿到后端返回的数据,不要指望 ajax 拿到数据以后能自己去跳转,更不要指望 ajax 拿到数据以后会重新渲染页面,ajax 拿到数据后,唯一能做的就是用 javascript 使用这些数据,具体的使用要么是 js 更新页面相关的 html 节点,本么是用 location = data.url; 这样的语句跳转页面

JFinal

2016-10-20 17:01

@jinyuanyuanab 所以,有了上面的两个“不要指望”以后,就应该明白了为啥后端 redirect 或者 render 对于 ajax 请求不起作用了。通常 ajax 请求需要与后端的 renderJson() 配合使用,当然也有少数情况可以与 render(xxx.html) 配合

jinyuanyuanab

2016-10-20 17:36

感谢您的耐心解答,其实整个项目已经完成差不多了,想要在拦截器中判断缓存失效的问题,这样看来,还是应该在页面接收也进行相关判断。

JFinal

2016-10-21 13:12

@jinyuanyuanab 其实有蛮多人误以为 ajax 会自动处理服务端返回的数据,ajax 是一段 js 代码发出的一个异步 http请求,按下面几条思脉理解一下就彻底明白了:

1:点击链接、地址栏输入这类普通请求是由浏览器发出,服务端响应数据以后,浏览器会自动处理,例如响应的是 html就渲染,响应的是 redirect 就去重定向

2:而 ajax 由一段 js 代码发出的异步请求,服务端响应的数据会被这段 js 代码所接管,此时对数据的处置权完全取决于这段 js 代码,如果这段 js 代码啥也不干,那就没有任何行为。误会就发生在这里,不少人误以为这段 js 代码会智能化的做出某些处理

linuxea

2017-04-15 19:15

@JFinal 如果页面都要判断的话,工作量太繁琐了。感谢詹总

热门反馈

扫码入社