Ajax重定向无效

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mozha_666/article/details/86519642

问题背景

以前写response.sendRedirect("/login.jsp");是成功的,今天用到ajax请求,发送给后台,希望直接跳转,发现无效,首先要深入了解ajax请求和response.sendRedirect的机制

response.sendRedirect的机制

这种方式是在客户端作的重定向处理。该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的

forward

这种方式是在服务器端作的重定向。
服务器往client发送数据的过程是这样的:
• 服务器在 向客户端发送数据之前,是先将数据输出到缓冲区,然后将缓冲区中数据发送给client端。什么时候将缓冲区里的数据发送给client端呢?
• (1)当对来自client的request处理完,并把所有数据输出到缓冲区,
• (2)当缓冲区满,
• (3)在程序中调用缓冲区的输出方法out.flush()或 response.flushbuffer(),web container才将缓冲区中的数据发送给client。
这种重定向方式是利用服务器端的缓冲区机制,在把缓冲区的数据发送到客户端之前,原来的数据不发送,将执行转向重定向页面,发送重定向页面的数据,重定向调用页的数据将被清除。如果在JSP:FORWORD之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么这种重定向方式将不起作用,这一点应该特别注意。
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher("/index.jsp");
rd.forward(request, response);

重定向和转发的区别

1、forward重定向是在容器内部实现的同一个Web应用程序的重定向,所以forward方法只能重定向到同一个Web应用程序中的一个资源,重定向后浏览器地址栏URL不变,
2、sendRedirect方法可以重定向到任何URL, 因为这种方法是修改http头来实现的,URL没什么限制,重定向后浏览器地址栏URL改变。
2、forward重定向将原始的HTTP请求对象(request)从一个servlet实例传递到另一个实例,而采用sendRedirect方式两者不是同一个application。
3、基于第二点,参数的传递方式不一样。forward的form参数跟着传递,所以在第二个实例中可以取得HTTP请求的参数。sendRedirect只能通过链接传递参数,response.sendRedirect(“login.jsp?param1=a”)。
4、sendRedirect能够处理相对URL,自动把它们转换成绝对URL,如果地址是相对的,没有一个‘/’,那么Web container就认为它是相对于当前的请求URI的。比如,如果为response.sendRedirect(“login.jsp”),则会从当前servlet 的URL路径下找login.jsp: http://10.1.18.8:8081/dms/servlet/Servlet 重定向的URL: http://10.1.18.8:8081/dms/servlet/login.jsp,如果为response.sendRedirect("/login.jsp")则会从当前应用径下查找url:http://10.1.18.8:8081/login.jsp。而forward不能这样处理相对路径。

Ajax请求原理

Ajax的原理:实际上就是通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。
了解XmlHttpRequestd对象

  1. XMLHttpRequest对象来向服务器发出一个请求,我们可以把服务器端看成一个数据接口,它返回的是一个纯文本流,当然,这个文本流可以是XML格式,可以是Html,可以是Javascript代码,也可以只是一个字符串
  2. 客户端在异步获取这个结果后,不是直接显示在页面,而是先由javascript来处理,然后再显示在页面。客户端在异步获取这个结果后,不是直接显示在页面,而是先由javascript来处理,然后再显示在页面。

所以由于请求都是采用Ajax的, 所以每次发起ajax请求, 虽然拦截器判断出未登录跳转到登录页面, 那么, 这次ajax请求的结果就是这个页面(具体的说, 这次请求返回的就是登录页面的源代码), 所以浏览器不会发生跳转. 通过在请求完成事件处理函数中判断返回的文本是不是登录页面的源码(比如检查返回值中是否包含用户登录, 这个和登录页面有关了), 如果包含, 则top.location.href=‘登录页面的url’,还是只能从responseText中获取跳转信息使用js跳转
参考:
http://www.blogjava.net/followith/archive/2009/04/24/267324.html
https://blog.csdn.net/jazywoo123/article/details/7981791

猜你喜欢

转载自blog.csdn.net/mozha_666/article/details/86519642