• ajax的xmlHttpRequest异步请求和Springmvc的sendRedirect失效问题


    参考:

      Ext 提交表单用的异步提交Ajax。Ajax在发送请求时后台返回的数据(json或者html页面)在其回调函数中处理。  你这个相当于后台把Center_right.jsp页面已经返回给前台了但是前台回调函数中没有处理。 
    方法: 
    1.请求成功过后他返回下个页面的url,通过js直接去请求相应页面 如window.location.href="Center_right.jsp" 
    2.或者拿到后台页面后通过document.getElementById('??').html=responseText;直接修改页面内容

    ajax请求后台,response.sendRedirect失效,无法重定向

    用Ajax发送请求,然后后台用sendRedirec函数返回一个页面,但是实际上却什么也没有,用Fiddler4拦截http信息,发现确实返回了界面,颇为不解,搜索发现答案,转载备忘

    原文地址http://www.ithao123.cn/content-2251957.html

    response.sendRedirect的机制

      首先我们要明白用response.sendRedirect做转向的原理,它其实是向浏览器发送一个特殊的Header,然后由浏览器来做转向,转到指定的页面,所以用sendRedirect时,浏览器的地址栏上可以看到地址的变化。
    用<jsp:forward page=""/>则不同,它是直接在server做的,浏览器并不知道,也不和浏览器打交道,这从浏览器的地址并不变化可以看出。
    所以使用response.sendRedirect时就需要注意以下两点:
    1,在使用response.sendRedirect时,前面不能有HTML输出。
    这并不是绝对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制,一般在8K(我是说JSP SERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。
    如果报错说,“一些信息已经被submitted”(原文忘了),那么,你就要注意看了,前面是不是有过多的HTML输出了。
    2,在response.sendRedirect之后,应该紧跟一句return;
    我们已经知道response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。

    ajax请求

     Ajax的原理简单来说,实际上就是通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。 
    这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和原理,我们必须对 XMLHttpRequest有所了解。 
        我们可以看出,XMLHttpRequest对象完全用来向服务器发出一个请求的,它的作用也局限于此,但它的作用是整个ajax实现的关键,我们可以把服务器端看成一个数据接口,它返回的是一个纯文本流,当然,这个文本流可以是XML格式,可以是Html,可以是Javascript代码,也可以只是一个字符串。这时候,XMLHttpRequest向服务器端请求这个页面,服务器端将文本的结果写入页面,这和普通的web开发流程是一样的,不同的是,客户端在异步获取这个结果后,不是直接显示在页面,而是先由javascript来处理,然后再显示在页面。

    解决sendRedirect失效的方法:
    改变地址栏的方法,目前好像只能用location.href的方法改变。
    代码如下:
    var url='/aaa/abc'
    $.ajax({
    url:url,
    type: 'post',
    data: data,
    dataType: 'json',
    success: function (data) {
    location.href =url;
    }

    //针对于ajax异步请求response.sendRedirect失效的处理
    $(document).ready(function(){
    var redirect;
    redirect = "${redirect}";// 在js中使用el表达式需要使用双引号括上
    if(redirect == "1"){
    var win = window;
    while(win != win.top){ // 顶层窗口,防止嵌入iframe窗口
    win = win.top;
    }
    win.location.href = "${redirectUrl}";//将后端重定向的地址取出来,使用win.location.href去实现重定向的要求
    }
    });

    重定向和请求转发的区别:

      redirect 后,确认了要跳转的页面的 url,继续执行 redirect 下面的代码;执行完后,断开当前的与

    用户所发出的请求连接,即断开 request 的引用指向,因此 request 里存放的 username 信息也会丢失

    然后再与用户建立新的请求连接,即创建新的 request 对象,这样 false 页面的通过

    request.getAttribute("user") 就会得到一个 null 值;最终显示的是页面是 false 页面,所以地址栏

    的 url 内容会发生变化。

        forward 后,确认了要跳转的页面的 url,现在停止继续执行后面的代码,而是先执行 success

    (servlet) 里的代码,执行完后再回来继续执行 check 后面的代码;在这期间 check 和 success 共享

    一个 request 和 response 对象,所以 success 页面通过 request.getAttribute("user") 便可以取到

    值;这个过程最后执行的还是 check 页面(即使 forward 后面没有任何代码),所以地址栏的 url 内容

    不会发生变化。

  • 相关阅读:
    部分测试文档
    部分说明文档
    最终复审
    M2postmortem
    Beta版本发布说明
    M2项目测试
    Daily scrum 12.24
    Daily scrum 12.21
    Daily scrum 12.20
    个人阅读作业2
  • 原文地址:https://www.cnblogs.com/lirenhe/p/10339645.html
Copyright © 2020-2023  润新知