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

今天在写项目的时候,想加一个切换用户,需要清除session并且跳转到登录页面,发起一个ajax请求后,执行完发现无法跳转。

原因在于: 
(从网上摘录) 
Ajax只是利用脚本访问对应url获取数据而已,不能做除了获取返回数据以外的其它动作了。所以浏览器端是不会发起重定向的。 
1)正常的http url请求,只有浏览器和服务器两个参与者。浏览器端发起一个http请求,服务器端处理后发起一个重定向,浏览器端从response中获取到重定向地址,发起另一个http url请求。也就是说,浏览器会按照response中的内容进行响应(如重定向),这是浏览器的功能决定的就得响应。 
2)Ajax请求,参与者就有三个即ajax、客户端、服务器,ajax处于客户端和服务器两者之间。过程是客户端发起一个ajax请求,服务器端处理后,如果发起一个重定向,然后ajax会怎么办呢?它只会获取刚才请求返回的数据,其他的任何动作一概不去做,ajax是这么做的(ajax功能就是这么设定的,ajax框架源代码也是这么写的)。 
也就是说,引入了ajax之后,ajax就插在浏览器和服务器之间了,服务器给浏览器的response被ajax拦截了,但是ajax本身却什么都不做,也不转达。

解决方法: 
1.后台做完清除session后,传一个值给前台判断,在前台进行页面的跳转。 
后台:

@RequestMapping("/clearSession.html")
    public void clearSession(HttpServletRequest request,HttpServletResponse response)throws Exception{
        HttpSession session = request.getSession();
        BaseUser user = (BaseUser) request.getSession().getAttribute(Constants.USER_INFO);
        if(user!=null){//防止执行清除session的方法时,session已经过期。
            session.invalidate();
        }

前台:

success: function(data){
                        window.location.replace("/Nidson-ssm/login.jsp");
                    },
                    error:function(data) {
                        alert("服务器出错");
                        window.location.replace("/Nidson-ssm/login.jsp");
                    },

2.后台拦截ajax请求。

后台:

 //对于请求是ajax请求重定向问题的处理方法
        public void reDirect(HttpServletRequest request, HttpServletResponse response) throws IOException{
            //获取当前请求的路径
            String basePath = request.getScheme() + "://" + request.getServerName() + ":"  + request.getServerPort()+request.getContextPath();
            //如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求,需要特殊处理
            if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){
                //告诉ajax我是重定向
                response.setHeader("REDIRECT", "REDIRECT");
                //告诉ajax我重定向的路径
                response.setHeader("CONTENTPATH", basePath+"/login.html");
                response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            }else{
                response.sendRedirect(basePath + "/login.html");
            }
        }

前台:

var jqxhr;
    //设置ajax请求完成后运行的函数,
    $.ajaxSetup({
        complete:function(){
            if("REDIRECT" == jqxhr.getResponseHeader("REDIRECT")){ //若HEADER中含有REDIRECT说明后端想重定向,
                var win = window;
                while(win != win.top){
                    win = win.top;
                }
                win.location.href = jqxhr.getResponseHeader("CONTENTPATH");//将后端重定向的地址取出来,使用win.location.href去实现重定向的要求
            }
        }
    });

原文地址:https://www.cnblogs.com/a-du/p/10812038.html

时间: 2024-11-07 20:26:58

ajax请求后台,response.sendRedirect失效,无法重定向的相关文章

ajax请求后台,返回json格式数据,模板!

添加一个用户的时候,需要找出公司下所有的部门,和相应部门下的角色,利用ajax请求,实现联动技术.将返回的json格式数据,添加到select标签下. <script type="text/javascript">        //加载出部门的信息            function loadGroup(){                            $.ajax({                    type:"post",  

mvc5 webap2 前台如何使用 ajax 请求后台API

按照正常的写法,总是出现404错误,研究了很久,在这里找到了解决方案:http://buxuxiao.com/article/using-jquery-to-post-frombody-parameters-to-web-api 现在总结一下, 单个参数的情况下: 1.后台参数正确的写法如下: [Route("Services/{controller}/{action}")] [HttpPost] [HttpGet] public string UploadTransportNetwo

vue实战使用ajax请求后台数据(小白)

vue实战使用ajax请求后台数据(小白) 前言:前端小白入门到这个阶段,应该会知道我们所做的页面上那些数据,绝大部分都不是静态的数据,而是通过调用后台接口把数据渲染到页面上的效果.ajax可以帮助我们更好的去实现这一点,下面是详解在vue中如何使用它. vue本身它是不支持直接发送ajax请求的,需要用到axios(一个基于promise的HTTP库,可以用在浏览器和node.js中)这是Axios文档的介绍,详细可查看:https://www.kancloud.cn/yunye/axios/

07. ajax请求,解决sendRedirect 无效

介绍: 后台基于旧代码用的Filter验证,若 Session过期,则跳转登陆页面 前台框架:EasyUI 问题: 最初后台验证不通过: 1 httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/login.html"); 但是该方式对ajax请求无效,无法跳转到登陆页面 所以我把 ajax请求 和 其它静态请求等 分开处理 1 2 3 4 5 6 if(servletPath.endsWith

ajax请求后台,有时收不到返回值的解决办法

昨天下午做项目遇到一个问题,贴出来方便以后翻阅,也给大家个参考. 问题: 具体做的是个文件导入的功能,导入的功能是成功了,但是界面一直得不到返回值,排查了一下午,调试的时候是可以有返回的,但是关掉浏览器调试界面,却得不到返回结果. 原因: 一直以为是我后台程序有问题,晚上回到家才想起来ajax的问题,把ajax的异步处理改为同步,就出来效果了,具体的原因请看下文详解. jquery中ajax方法有个属性async用于控制同步和异步,默认是true,即ajax请求默认是异步请求,有时项目中会用到A

ajax 请求后台数据返回异常 及 提示404方法名不存在

1.正常使用 Ajax 调取后台数据时,提示方法名不存在,Ajax前端正常,方法类bean注入正常,方法注解正常.但参数解析时出现异常. @RequestMapping(value="/getProject") @ResponseBody public Map<String,Object> getProject(@RequestBody Map<String, Object> paraMap,HttpServletRequest request){ Map<

在ajax请求后台时在请求标头RequestHeader加token

情景:为了保证系统数据的安全性,一般前后台之间的数据访问会有授权与验证,这里的Token机制相对于Cookie支持跨域访问,在RESTful API里面,验证一般可以使用POST请求来通过验证,使服务端发送带有token的响应.或者,使用GET请求,这需要参数提供凭证(指URL),或者请求头里带有token. 此处为上述的第二种方法:在ajax请求的标头中加Token 1 var str = sessionStorage.getItem("userInfo"); 2 var currU

MUI框架编写修改密码页面并且ajax请求后台数据拿到接口完成修改密码功能

<html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> <title>修改密码</title> <li

AjAX请求后台,无刷新更新页面

$(function () {        $('#按钮ID').click(function () { $.ajax({                url: '请求地址',                data: '传递参数',                datatype: 'text/plain',//请求类型                success: function (返回参数) {                    if (result == "1")