一些理解-过滤器,拦截器,ajax提交后不跳转,document.location.href无效,回调函数。

1.struts2中过滤器和拦截器的工作流程:

request-->执行自定义过滤器doFilter方法中的chain.doFilter()方法前的代码-->执行默认过滤器doFilter方法中的chain.doFilter()方法前的代码-->执行默认拦截器-->执行自定义拦截器-->访问服务器资源(action,css,html,jsp...)-->执行自定义拦截器-->执行默认拦截器-->执行默认过滤器的doFilter方法中chain.doFilter()方法后的代码-->执行自定义过滤器doFilter方法中的chain.doFilter()方法后的代码-->客户端开始执行响应response

注:①上面的自定义的过滤器在默认过滤器之前执行只是一个假设的顺序,这其中光光默认的过滤器这个执行过程就有很多细节,这个网上资料或者源码剖析有很多。

  ②自定义过滤器有多个的话,它的执行顺序和你在web.xml中布置的先后顺序有关,前者先执行。

  ③注意请求和响应这个来回中,多个过滤器的前后执行和拦截器的前后执行顺序是对称的。

2.ajax的同步是ajax的事没做完前,其他的事不能做,要等着它。异步相反,同时性互不影响地执行。

3.注意起来一个情况:ajax+submit+同步----就是你用ajax请求服务器,而且用的是同步的方式,并且你是通过点击了type类型为submit的按钮来触发这个ajax。

这个时候,首先你点击了submit,它会提交表单,但是由于你用了ajax的同步操作,submit的提交被阻塞,ajax先执行,这个时候,如果你在ajax的回调函数(如:success)中写了document.location.href=‘xxx.html‘,它是执行了,的确是去执行了跳转的,于是ajax完成了,那接下来就要把刚才的submit提交的请求完成。于是呢又要从xxx.html跳回到刚才那个页面(无论你submit有没有提交具体的数据,总之提交了之后如果后台没有执行跳转/重定向,它就要回到原来的页面。)

即:ajax就是如你所想那样执行了,也从A页面跳到了B页面,但是由于submit这种类型的特殊性,又让B页面跳回了A页面,由于这个ajax执行完再执行submit请求的过程处理的很快,你会感到好像没有效果,但是你仔细观察,会发现这个过程页面会刷新的,其实就是B页面跳回到A页面。

所以当用ajax去请求时,我们要用button,而不是submit,更要慎用同步。

4.回调函数理解:

不严谨地用ajax来说吧:ajax提交了一个请求,比如去请求了一个action,这个时候ajax跟这个action说,老哥你帮我办个事呗(我给你个地址,你去帮我拿个东西,然后好了交给我),然后action答应了并且把要处理的业务处理完。这个时候,action想告诉ajax你叫我做的我完成了,并且你跟我要的东西我也准备好了,但是我怎么给你呀??

①:大家想下怎么回头告诉ajax你叫我做的我做好了,并且要把东西给ajax?难道又要弄个请求,去请求这个东西?这样的话,那这个请求怎么知道前面请求了什么,怎么知道要去拿什么?就像ajax在叫他的朋友ajaxBBBB去帮他去到Action那里拿,可是这次ACtion又怎么告诉这个ajaxBBBB说东西在哪,你过来拿。这个又怎么通知ajaxBBBB,难道又要弄个请求,这个请求问问他东西放哪??这不是陷入无限循环了嘛,所以就有了回调函数。

②:回调函数这个函数是存在于ajax里面定义的,只是有了借口能够给别人调用。比如Action完成了请求的业务,于是调用了ajax的success回调函数,把数据回传给ajax,然后success回调函数去处理这些数据。

  这就好像:ajax觉得刚才这事不行,很烦。所以他花了大价钱,买了一辆小货车,这个车就是属于ajax的,然后每次ajax叫action办事,他只要跟action说要办的事,然后就在家里等着,action做好了,只要去把ajax的货车开过来,把东西装上,给ajax送过去。这个车就是回调函数,他属于发出请求的一方,而调用他的是被请求的一方,因为回调函数是在请求一方的体内,请求方可以知道可以得到可以访问这个函数,也就可以得到这个函数体内的信息了。

③:为了帮助记忆,用一句话来说。-------A对象有2个方法,一个方法是用于发送请求到B的,另一个是B完成请求去用来传送信息和数据的。A发请求,B接收并完成,B再调用A中的回调函数,A执行这个回调函数。

其实说这个B调用了A中的回调函数是很不严谨甚至错误的,因为B的目的是传回消息和数据给A,B只是说把数据作为回调函数的一个参数,等A执行回调函数的时候用罢了。这个过程还有很多细节。我只是为了大家好理解。

我只是尽力地阐述了我的理解。有不对的地方望指正,至于一些很细很细的源码,过程之类的剖析可以百度,这些网上很多的。

时间: 2024-10-15 07:37:14

一些理解-过滤器,拦截器,ajax提交后不跳转,document.location.href无效,回调函数。的相关文章

Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求

Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 java 判断请求是不是ajax请求,Java判断是否为ajax请求 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ?Copyright 蕃薯耀 2017年8月10日 http://www.cnblogs.com/

Spring AOP深入理解之拦截器调用

Spring AOP深入理解之拦截器调用 Spring AOP代理对象生成回想 上一篇博客中:深入理解Spring AOP之二代理对象生成介绍了Spring代理对象是怎样生成的,当中重点介绍了JDK动态代理方式,简单回想下代理对象生成过程: 1.上面讲到了两种生成代理对象的方法,一种是通过ProxyFactory,一种是通过ProxyFactoryBean. 第一种获取比較简单,可是须要手工的进行写代码.而另外一种是通过Spring的IOC机制来控制Bean的生成. 2.不管是ProxyFact

Ajax 提交session实效跳转到完整的登陆页面

(function($){ // 保存原有的jquery ajax; var $_ajax = $.ajax; $.ajax = function(options){ var originalSuccess, mySuccess, success_context; if (options.success) { // save reference to original success callback originalSuccess = options.success; success_cont

过滤器 拦截器 区别

转 http://www.cnblogs.com/wangyuyu/archive/2013/07/02/3167354.html 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 4.拦截器可以访问action上下文.值栈里的对象,而过滤器不能 5.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

jquery的ajax提交后,会跳转页面

今天在写代码的时候,遇到一个很奇怪的问题,一个form表单,用的是ajax的方式提交.结果,在服务器端php中,使用exit(),函数后都不能停止,并且继续跳转到本页.请求如下: 第一个请求中,其实我已经停止了代码,但程序并没有执行到,但返回的也是200状态码. 虽然,请求返回的是200,但查看reponse时,却发现是空的. 后来经过排查发现,原来是前端写的页面已经在input控件上,写好了type="submit"(都怪自己粗心,居然没看看),然后真相大白了.原因是,提交按钮绑定了

SpringBoot 过滤器, 拦截器, 监听器 对比及使用场景

1. 过滤器 (实现 javax.servlet.Filter 接口) ① 过滤器是在web应用启动的时候初始化一次, 在web应用停止的时候销毁. ② 可以对请求的URL进行过滤, 对敏感词过滤, ③ 挡在拦截器的外层 ④ Filter 是 Servlet 规范的一部分 2. 拦截器 (实现 org.springframework.web.servlet.HandlerInterceptor 接口) ① 不依赖Spring容器, 可以使用 Spring 容器管理的Bean ② 拦截器通过动态代

js / ajax 成功提交后怎么跳转到另外一个页面?

把success那段改成 success : function (r) { if ( r.status == 'error' ){ alert(msg[r.msgno]); } else if (r.status == 'success') { alert(msg[r.msgno]); //location.reload(true); window.location.href="http://www.hao123.com";//你可以跟换里面的网址,以便成功后跳转 } },

ajax提交session超时跳转页面使用全局的方法来处理

来自:http://www.jb51.net/article/43770.htm 如果是ajax提交,超时时从服务器发出的跳转命令就不会起作用,所以如果是session超时,而且是在ajax请求,就在响应头里,再用一个全局的方法来处理session超时要跳转的页面. 在过滤器中写入如下方法:(未测试) public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws I

在MVC中添加拦截器实现登录后的权限验证

1.新建一个类 (以下实现了打印日志功能) using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcReporistory.Controllers { public class LoggerFilter : FilterAttribute, IActionFilter { void IActionFilter.On