原因:

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

解决方案:

开发中需要多处使用重定向的情况下,大多都是在Spring mvc 的拦截器中,或过滤器中使用,此方法是在spring mvc拦截器中实现。

在拦截器中通过获取session(我的用户信息是存在session中)判断用户的登陆状态,没有登陆重定向到登陆页面。

请求路径获取:

1. request.getScheme() 返回当前链接使用的协议;

2. request.getServerName() 获取网站的域名;

3. request.getServerPort() 获取的服务器的请求端口;

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

后端代码:

    1. import java.io.IOException;
        1. import javax.servlet.http.HttpServletRequest;
          1. import javax.servlet.http.HttpServletResponse;
            1. import javax.servlet.http.HttpSession;
                1. import org.apache.log4j.Logger;
                  1. import org.springframework.web.servlet.HandlerInterceptor;
                    1. import org.springframework.web.servlet.ModelAndView;
                        1. public class LoginInterceptor implements HandlerInterceptor{
                            1. private static Logger logger = Logger.getLogger(LoginInterceptor.class);
                              1. @Override
                                1. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                                  1. throws Exception {
                                    1. response.setHeader("Access-Control-Allow-Origin", "http://localhost"); // 允许跨域请求
                                      1. response.setHeader("Access-Control-Allow-Credentials", "true");
                                        1. HttpSession session = request.getSession();
                                          1. Object userId = session.getAttribute("userId");
                                            1. if(userId == null){
                                              1. logger.info("用户未登录");
                                                1. requestDirect(request, response);
                                                  1. return false;
                                                    1. }else{
                                                      1. return true;
                                                        1. }
                                                          1. }
                                                              1. @Override
                                                                1. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                                                                  1. ModelAndView modelAndView) throws Exception {
                                                                      1. }
                                                                          1. @Override
                                                                            1. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                                                                              1. throws Exception {
                                                                                  1. }
                                                                                      1. public void requestDirect(HttpServletRequest request, HttpServletResponse response) throws IOException{
                                                                                        1. //获取当前请求的路径
                                                                                          1. String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+request.getContextPath();
                                                                                            1. //如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求
                                                                                              1. if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){
                                                                                                1. //前端需要判断是否是重定向
                                                                                                  1. response.setHeader("REDIRECT", "REDIRECT");
                                                                                                    1. //需要重定向的路径
                                                                                                      1. response.setHeader("CONTENTPATH", basePath+"/login.html");
                                                                                                        1. response.setStatus(HttpServletResponse.SC_FORBIDDEN);
                                                                                                          1. }else{
                                                                                                            1. response.sendRedirect(basePath + "/login.html");
                                                                                                              1. }
                                                                                                                1. }
                                                                                                                    1. }
                                                                                                                  1.  

                                                                                                                  前端代码:

                                                                                                                  下面的代码请放在全局的js中 (用于初始化ajax请求,让它结束之后运行completer后面的函数)

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

                                                                                                                                          $.ajaxSetup()方法的详解链接

                                                                                                                                          ajax 发送请求无法重定向问题的更多相关文章

                                                                                                                                          1. Ajax - 发送请求原理

                                                                                                                                            1,什么是ajax? Asynchronous JavaScript and XML(当然现在xml已经由json代替): 主要是用于前后台的交互(表单提交已经被废弃): 使用场景:前台获取数据.表单 ...

                                                                                                                                          2. ajax发送请求跨域 - uri java代理

                                                                                                                                            问题:ajax发送请求出现cors跨域 解决办法:可以通过java代理的方式,后台发送请求 1.get请求 public void proxyGet(String url) { try { URL r ...

                                                                                                                                          3. Ajax发送请求等待时弹出模态框等待提示

                                                                                                                                            主要的代码分为两块,一个是CSS定义模态框,另一个是在Ajax中弹出模态框. 查看菜鸟教程中的模态框教程demo,http://www.runoob.com/try/try.php?filename= ...

                                                                                                                                          4. ajax对象。同步与异步及ajax发送请求

                                                                                                                                            ajax对象的属性.方法 属性 readyState: Ajax状态码 * 0:表示对象已建立,但未初始化,只是 new 成功获取了对象,但是未调用open方法 1:表示对象已初始化,但未发送,调用了 ...

                                                                                                                                          5. Django——Ajax发送请求验证用户名是否被注册

                                                                                                                                            场景: 用户注册的时候,输入用户名之后,Ajax发送请求到后端,后端验证该用户名是否已经被注册,然后返回到注册页面提示用户. 1.模型: from django.db import models cl ...

                                                                                                                                          6. ajax发送请求

                                                                                                                                            首先创建XMLHttpRequest对象,利用此对象发送请求 主页面 <!doctype html> <html lang="en"> <head&g ...

                                                                                                                                          7. 原生Ajax发送请求

                                                                                                                                            ajax  get&post 1.使用get发送请求,会有请求缓存 1)什么叫请求缓存,请求信息相同浏览器不会再向服务器发送请求,导致访问服务器失败. 2)解决:将随机数添加到请求路径后面参数 ...

                                                                                                                                          8. angularjs --- ngResource 类似于 ajax发送请求。

                                                                                                                                            <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

                                                                                                                                          9. Ajax发送请求的四个步骤

                                                                                                                                            1.创建XMLHttpRequest let xhr=new XMLHttpRequest; 2.连接服务器 xhr.open("get","goods.json&quo ...

                                                                                                                                          随机推荐

                                                                                                                                          1. MySQLSocketPHPvimApache

                                                                                                                                            原文:http://www.blogjava.net/asenyifei/articles/82575.html 自己装了一个MYSQL客户端,但却发现出现这样的错误: Can't connect t ...

                                                                                                                                          2. 妙味css3课程---1-1、css中自定义属性可以用属性选择器么

                                                                                                                                            妙味css3课程---1-1.css中自定义属性可以用属性选择器么 一.总结 一句话总结:可以的. 1.如何实现用属性选择器实现a标签根据href里面含有的字段选择背景图片? p a[href*=te ...

                                                                                                                                          3. Android Studio将Eclipse的项目作为module的依赖库

                                                                                                                                            情形: 我们现在有一个eclipse的项目,我们想把这个项目作为android studio的module的一个依赖库. 以前我们在eclipse的时候常常是在一个工作区里面把一个A工程 as a l ...

                                                                                                                                          4. menuconfig_kconfig

                                                                                                                                            这一节的主要内容: Menuconfig的操作 Kconfig和.config文件 Linux内核配置裁剪实验 linux编译器通过.config文件确认哪些代码编译进内核,哪些被裁减掉 menuco ...

                                                                                                                                          5. Ubuntu14.04中踩过的坑

                                                                                                                                            今天安装Ubuntu 14.0.4,因为需要使用python3,所以就直接配置如下:sudo rm /usr/bin/pythonsudo ln -s /usr/bin/python3.5  /usr ...

                                                                                                                                          6. Android 最简洁的获取联系人头像的代码

                                                                                                                                            ContentResolver cr = view.getContext().getContentResolver(); Uri uri = ContentUris.withAppendedId(Co ...

                                                                                                                                          7. Loadrunner--Analysis网页细分图

                                                                                                                                            续LR实战之Discuz开源论坛项目,之前一直是创建虚拟用户脚本(Virtual User Generator)和场景(Controller),现在,终于到了LoadRunner性能测试结果分析(An ...

                                                                                                                                          8. Oracle Web链接客户端

                                                                                                                                            TreeSoft数据库管理系统 http://www.treesoft.cn        

                                                                                                                                          9. 3、U-boot的环境变量: bootcmd 和bootargs

                                                                                                                                            u-bootcmdbootcmd是uboot自动启动时默认执行的一些命令,因此你可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置bootcmd为你经常使用的那种参数.   现在我的boo ...

                                                                                                                                          10. PostgreSQL 序列

                                                                                                                                            PostgreSQL 中的序列是一个数据库对象,本质上是一个自增器.因此,序列在其他同类型数据库软件中以 autoincrment 值的形式存在.在一张表需要非随机,唯一标实符的场景下,Sequenc ...