ajax请求返回重定向信息

3 篇文章 1 订阅
1 篇文章 0 订阅

在项目中,考虑到web前台ajax请求未登录资源时,后台返回的重定向信息,ajax不能自动判断是否是重定向,以下是一种折中方法,如各位有什么更好的方法,还请告诉我一声,哈哈

下面进入正题.............

LoginInterceptor.java:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.yasinyt.loan.admin.entity.User;
import com.yasinyt.loan.admin.util.IPUtils;
/**
 * 登陆拦截器
 * @projectName loan-admin
 * @packageName com.yasinyt.loan.admin.interceptor
 * @author E-mail: liuzongyang@yasinyt.com
 * @date 2017年10月7日 上午9:15:35 
 * @version 1.0
 * @description 如果用户未登录,或者登陆超时,访问需要登录访问的资源时则会重定向到登陆页面
 */
public class LoginInterceptor extends HandlerInterceptorAdapter {
	
	private static Logger log = LoggerFactory.getLogger(LoginInterceptor.class);
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// 获得请求路径的uri
		String uri = request.getRequestURI();
		HttpSession session = request.getSession();
		// 进入登录页面,判断session中是否有key,有的话重定向到首页,否则进入登录界面
		User user = (User) session.getAttribute(session.getId());
		if (uri.contains("login") || uri.contains("getYzm")) {
			return true;
		}else {
			String ipv4 = IPUtils.getRequestIp(request);
			if ( user == null) {
				StringBuilder sb = new StringBuilder();
				String port = "",contextPath="";
				if(request.getServerPort()!=80){
					port = ":" + request.getServerPort();
				}
				if(StringUtils.isNoneBlank(request.getContextPath().replace("/", ""))){
					contextPath = request.getContextPath();
				}
				sb.append(request.getScheme()).append("://").append(request.getServerName()).append(port).append(contextPath).append("/login");
				
				String loginPath =  sb.toString();   
				log.warn("发起请求IP未登录:IP:{}", ipv4);
				//判断如果是ajax,则需要设置response参数,告诉ajax这是重定向
				//这里设置完之后,需要到common.js中设置jquery-ajax默认设置,详细查看$.ajaxSetup方法
				String type = request.getHeader("X-Requested-With")==null?"":request.getHeader("X-Requested-With");
				if ("XMLHttpRequest".equals(type)) {
                    response.setHeader("REDIRECT", "REDIRECT");//告诉ajax这是重定向  
                    response.setHeader("CONTEXTPATH", loginPath);//重定向地址  
                    response.setStatus(HttpServletResponse.SC_FORBIDDEN);
                    return false;
                }else{//如果不是ajax请求,则直接重定向
                    response.sendRedirect(loginPath);  
                    return false;  
                }  
			} else{ 
				log.info("发起请求IP:{},sessionId:{},用户名:{},姓名:{}", 
						ipv4, 
						session.getId(),
						user.getUserName(),
						user.getRealName()
						);
				
				return true;
			}
		}
	}
	
}


前端jquery.ajax默认设置,ajax设置要放在程序ajax调用前,我一般放在jsp统一引用文件头里的,这样调用ajax的时候就无需操心其他设置了

/**
 * ajax默认设置
 * 包括默认提交方式为POST,
 * 判断后台是否是重定向
 */
$.ajaxSetup( {    
    //设置ajax请求结束后的执行动作    
    complete : function(XMLHttpRequest, textStatus) {  
        // 通过XMLHttpRequest取得响应头,REDIRECT    
        var redirect = XMLHttpRequest.getResponseHeader("REDIRECT");//若HEADER中含有REDIRECT说明后端想重定向  
        if (redirect == "REDIRECT") {
            var win = window;    
            while (win != win.top){  
                win = win.top;  
            }
            //将后端重定向的地址取出来,使用win.location.href去实现重定向的要求  
			layerAlert(layer,"您的登录信息已超时,请重新登录<p class='ps'>ps:在客户端闲置10分钟后系统会自动登出</p>",'登录超时提示',5,'',0,function(){
			    win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");
			})
        }
    },
    type:'POST'
});  

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值