前言

本文着重解决前后端分离开发的页面调整问题。

笔者,在做一个需求,需要对访问网站,但是没有登录的用户进行拦截,将他们重定向到首页。

很简单的一个需求,使用 springMvc 的拦截器即可完成需求;但是在编码的时候,页面总是无法进行跳转。

后来在google上一通搜索,知道了问题的原因,前后端分离,前台使用ajax异步请求的锅 ;

ajax,何为ajax,简单说就是局部网页刷新技术。前后端分离以后,后台逐渐淡化了对页面逻辑跳转的控制,将这些交给了前端去做,前台利用ajax,异步请求后台,获得数据,局部刷新网页,实现了许多方便的功能;

因此,即使后台进行页面跳转的编码,然后前台请求完毕以后,只会执行 ajax的回调函数,至于后台那些逻辑,对不起,我ajax一概不管滴;

听到这里,大家也应该猜到应该怎么做了,对,开始甩锅,跟前端同学大声的说,这是你的事呀,你在ajax的回调函数里面进行页面的跳转啊,你的前台技术是怎么肥四。


$.ajaxSetup( )

在改动 ajax 之前不要着急,如果在上面提到的回调函数里面进行修改,那么前端同学的代码,就要改动很多,凡是涉及ajax请求的方法,都要加上页面跳转的逻辑了。。。

这里使用 $.ajaxSetup( ),可以看着是对 ajax 的增强,对比与 spring事务的后置增强$.ajaxSetup( ) 会在每个 ajax请求完成以后得到执行(是不是感觉就是一个后置增强啊);

将下面的代码,交给前端童鞋,让他放到 引入的公共的 js文件里面

// 解决Ajax异步请求 springMvc 不跳转页面的问题
$.ajaxSetup( {
//设置ajax请求结束后的执行动作
complete :
function(XMLHttpRequest, textStatus) {
// 通过XMLHttpRequest取得响应头,sessionstatus
var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus");
if (sessionstatus == "TIMEOUT") {
var win = window;
while (win != win.top){
win = win.top;
}
win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");
}
}
});

这段代码的含义,大抵就是,在 ajax请求完成以后,执行 complete 回调方法,里面进行一些逻辑的判断;

这里判断 session 的状态,如果是超时被销毁了,则进行页面的跳转,跳到 CONTEXTPATH 的值那 ;

session 的状态以及 CONTEXTPATH 的值,由我们后台同学定义;

如下:在拦截器的preHandle方法中,添加如下逻辑

 		HttpSession session = httpServletRequest.getSession();
User user = (User) session.getAttribute("user");
if (user == null) {
// 获取到项目名,以便下面进行重定向
String homeUrl = httpServletRequest.getContextPath();
// 如果是 ajax 请求,则设置 session 状态 、CONTEXTPATH 的路径值
// 如果是ajax请求响应头会有,x-requested-with
if (httpServletRequest.getHeader("x-requested-with") != null && httpServletRequest.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
httpServletResponse.setHeader("SESSIONSTATUS", "TIMEOUT");
httpServletResponse.setHeader("CONTEXTPATH", homeUrl+"/index.html");
// FORBIDDEN,forbidden。也就是禁止、403
httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
}else{
// 如果不是 ajax 请求,则直接跳转即可
httpServletResponse.sendRedirect(homeUrl+"/index.html");
}
return false;
}

后记

因为以上处理,springMvc 就又可以继续愉快的处理页面的跳转了;

主要是记住 ajax异步请求,前台的逻辑最后都走ajax的回调函数,只会接受后台的返回数据,不会搭理页面跳转这样的要求的,因为人家毕竟只是局部刷新,而后台却要整个页面刷新。。

【坑】前端使用ajax异步请求以后,springMvc拦截器跳转页面无效的更多相关文章

  1. ajax异步请求302分析

    1.前言 遇到这样一种情况,打开网页两个窗口a,b(都是已经登录授权的),在a页面中退出登录,然后在b页面执行增删改查,这个时候因为授权原因,b页面后端的请求肯定出现异常(对这个异常的处理,进行内部跳 ...

  2. SpringMVC拦截器详解[附带源码分析]

    目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:h ...

  3. SpringMVC拦截器详解

    拦截器是每个Web框架必备的功能,也是个老生常谈的主题了. 本文将分析SpringMVC的拦截器功能是如何设计的,让读者了解该功能设计的原理. 重要接口及类介绍 1. HandlerExecution ...

  4. [转]SpringMVC拦截器详解[附带源码分析]

      目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:ht ...

  5. SpringMVC拦截器详解[附带源码分析](转)

    本文转自http://www.cnblogs.com/fangjian0423/p/springMVC-interceptor.html 感谢作者 目录 前言 重要接口及类介绍 源码分析 拦截器的配置 ...

  6. ajax异步请求

    做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...

  7. maven工程 java 实现文件上传 SSM ajax异步请求上传

    java ssm框架实现文件上传 实现:单文件上传.多文件上传(单选和多选),并且用 ajax 异步刷新,在当前界面显示上传的文件 首先springmvc的配置文件要配置上传文件解析器: <!- ...

  8. 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回

    作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...

  9. 关于我们ajax异步请求的方法与知识

      做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school ...

随机推荐

  1. Git的使用(1) —— 版本库

    1. 简介 Git作为一个分布式版本控制系统,其优点是不需要一直连接远端版本库就可以使用. 故其为实现分布版本控制专门设计了一整套的存储区间和语句,用来实现. (1) 本地版本库:建立在本机磁盘上的文 ...

  2. java 静态数组 和非静态数组的区别

    区别:1,数组创建时间不同,静态的是一定义出来就创建了,动态的则是定义时不创建,使用时才创建,一定意义上节省了内存空间.2,使用场景不同,一开始就知道数组长度的使用静态初始化,反之,动态初始化. 静态 ...

  3. Mysql中 查询慢的 Sql语句的记录查找

    Mysql中 查询慢的 Sql语句的记录查找 慢查询日志 slow_query_log,是用来记录查询比较慢的sql语句,通过查询日志来查找哪条sql语句比较慢,这样可以对比较慢的sql可以进行优化. ...

  4. C#利用反射获取实体类的主键名称或者获取实体类的值

    //获取主键的 PropertyInfo PropertyInfo pkProp = ).FirstOrDefault(); //主键名称 var keyName=pkProp.Name; //实体类 ...

  5. AndoridSQLite数据库开发基础教程(6)

    AndoridSQLite数据库开发基础教程(6) 为数据库添加添加空表 如果开发者想要往数据库中添加表和列,操作步骤如下: (1)在打开的数据库中,单击左下方的“+”按钮,弹出Table Edito ...

  6. 使用localStorage写一个简单的备忘录

    使用html+js实现一个简单的备忘录,主要体会一下localStorage的用法. 先看看效果图: 在输入框中输入文字,点击保存按钮,文本内容会在下放展示出来, 然后刷新下浏览器,会发现文本内容不会 ...

  7. 十一、LoadRunner组成和工作原理

    一.LoadRunner组成 虚拟用户发生器:Vuser Generator 压力调度和监控中心:Controller 压力生产器:Load Generator 压力结果分析工具:Analysis

  8. ASP中如何将数据库内容导入到数组?并进行字符串对比

    dim Arr sql1="select id from [aaa] where reader not like '%"&userid&"%'" ...

  9. python import注意事项

    # 基本概念 ## 模块&包简介 模块:所谓模块就是一个.py文件,用来存放变量,方法的文件,便于在其他python文件中导入(通过import或from).包(package): 包是更大的 ...

  10. ios开发将截图保存到相册

    - (void)loadImageFinished:(UIImage *)image { UIImageWriteToSavedPhotosAlbum(image, self, @selector(i ...