ajax 发送请求无法重定向

一. 原因

ajax 是默认就是不支持重定向的,它是局部刷新,不重新加载页面。

二. 解决办法

我的解决办法就是从前后端都做处理,项目中遇到重定向大多出现在拦截器或者过滤器中。在项目中我使用spring的拦截器去拦截所有的action请求,判断当前用户有无登录,若没有登录就重定向到登录页面。

1. 后端处理的代码

	public class MyInterceptor extends HandlerInterceptorAdapter{
		//该方法是进入controller的必经之路。
		@Override
		public boolean preHandle(HttpServletRequest request,
				HttpServletResponse response, Object handler) throws Exception {
			if(是否登录了?){
				return true; 
			}else { //没有登录重定向到登录页面
				reDirect(request, response); 
				return false;
			}
		}
	
		@Override
		public void postHandle(HttpServletRequest request,
				HttpServletResponse response, Object handler,
				ModelAndView modelAndView) throws Exception {
			// TODO Auto-generated method stub
			super.postHandle(request, response, handler, modelAndView);
		}
	
		@Override
		public void afterCompletion(HttpServletRequest request,
				HttpServletResponse response, Object handler, Exception ex)
				throws Exception {
			// TODO Auto-generated method stub
			super.afterCompletion(request, response, handler, ex);
		}
		
		//对于请求是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");
			}
		}
	
	}

说明一下请求路径的获取:
(1). request.getScheme() 返回当前链接使用的协议;比如,一般应用返回http;SSL返回https;
(2). request.getServerName() 获取网站的域名,如果是在本地的话就是localhost
(3). request.getServerPort() 获取的服务器的请求端口

(4). request.getContextPath()获取当前的系统路径

2. 前端处理的代码

(1). 下面的代码请放在全局的js中 (用于初始化ajax请求,让它结束之后运行completer后面的函数)
	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去实现重定向的要求
			}
	    }
	});

$.ajaxSetup()方法的详解请点击该链接

(2). 只要有ajax请求就让它的返回值为jqxhr

比如:jqxhr = $.post(url, requestData, function(result){})

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值