ajax请求不支持重定向,只能根据异步返回的信息,在前端进行页面的重定向。
现在服务端拦截器根据用户信息有无进行页面是否跳转到登录页,下面的方法可以实现
filter中的代码
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; String token = request.getParameter("token"); if(StrUtil.isBlank(token) || "null".equals(token)){ //未绑定,需要重定向到登录页 String redirectUrl = request.getContextPath()+"/login.html"; //重定向操作 redirect(request,response,redirectUrl); return; } filterChain.doFilter(request,response); }
/**
/** * 重定向的处理(包含异步请求) * @param request * @param response * @param redirectUrl * @throws IOException */ private void redirect(HttpServletRequest request,HttpServletResponse response,String redirectUrl) throws IOException{ String ctx = request.getContextPath(); if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){ //如果是ajax请求 //告诉ajax我是重定向 response.setHeader("REDIRECT", "redirect"); //告诉ajax我重定向的路径 response.setHeader("redirectUrl", redirectUrl); response.setStatus(HttpServletResponse.SC_FORBIDDEN); }else{ response.sendRedirect(redirectUrl); } }
//前端页面的额处理
$.post({ url:url, data:params, dataType:"json", complete:function(xhr,status){ //此处判断是否需要重定向 var REDIRECT = xhr.getResponseHeader("REDIRECT"); if (REDIRECT == "redirect") { var win = window; while (win != win.top) { win = win.top; } //重新跳转到 login.html win.location.href = xhr.getResponseHeader("redirectUrl"); } }, success:function(data){ if('${Constants.REQUEST_STATUS_SUCCESS}' == data.returnCode){ window.location.href = "${ctx}/kbApp/index.html?token="+token; var randomStr = makeTimeRandomStr(5); // localStorage.setItem("loginKey",randomStr); }else{ popupTips(data.returnMessage); } } });
其实原理还是在前端页面进行了一次页面的跳转