【坑】前端使用ajax异步请求以后,springMvc拦截器跳转页面无效
文章目录
前言
本文着重解决前后端分离开发的页面调整问题。
笔者,在做一个需求,需要对访问网站,但是没有登录的用户进行拦截,将他们重定向到首页。
很简单的一个需求,使用 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拦截器跳转页面无效的更多相关文章
- ajax异步请求302分析
1.前言 遇到这样一种情况,打开网页两个窗口a,b(都是已经登录授权的),在a页面中退出登录,然后在b页面执行增删改查,这个时候因为授权原因,b页面后端的请求肯定出现异常(对这个异常的处理,进行内部跳 ...
- SpringMVC拦截器详解[附带源码分析]
目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:h ...
- SpringMVC拦截器详解
拦截器是每个Web框架必备的功能,也是个老生常谈的主题了. 本文将分析SpringMVC的拦截器功能是如何设计的,让读者了解该功能设计的原理. 重要接口及类介绍 1. HandlerExecution ...
- [转]SpringMVC拦截器详解[附带源码分析]
目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:ht ...
- SpringMVC拦截器详解[附带源码分析](转)
本文转自http://www.cnblogs.com/fangjian0423/p/springMVC-interceptor.html 感谢作者 目录 前言 重要接口及类介绍 源码分析 拦截器的配置 ...
- ajax异步请求
做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...
- maven工程 java 实现文件上传 SSM ajax异步请求上传
java ssm框架实现文件上传 实现:单文件上传.多文件上传(单选和多选),并且用 ajax 异步刷新,在当前界面显示上传的文件 首先springmvc的配置文件要配置上传文件解析器: <!- ...
- 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回
作者:ssslinppp 时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...
- 关于我们ajax异步请求的方法与知识
做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school ...
随机推荐
- 使用xshell-ssh连接服务器,报错:Xshell Socket error Event: 32 Error: 10053
XShell连接CentOS系统时,报出Xshell Socket error Event: 32 Error: 10053..错误 有点烦人.. 操作:用SSH工具连接linux电脑出现的问题:Re ...
- HearthBuddy中的class276中的地址对应
2019年09月的 intptr_0 = method_18("mono.dll"); intptr_31 = intptr_0 + 522030; intptr_28 = int ...
- 在 delphi (Object Pascal 语言)中,使用 array 关键字进行数组定义。
如果需要定义二维数组可以采取以下定义形式: 一.静态数组定义 静态数组定义,通常用于数组元素的数目确定的情况.定义形式如下: 示例: 1 2 3 4 5 6 7 8 9 10 11 type // ...
- scrapy 爬虫教程
http://python.jobbole.com/87284/ 这篇教程不错,后面的参考链接很好 另外,注意xpath的坑,用chrome的网页调试工具会对xpath会自动优化,自己加上tbody, ...
- Enhancer | 增强子 专题
要做就做深做精! Everything needs good justification. The interpretation should be biologically and statisti ...
- Oracle中的统计信息
一.什么是统计信息 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.例如,表的行数,块数,平均每行的大小,索引的leaf blocks,索引字段的行数,不同值的大小等,都属于 ...
- ActiveMQ持久化
ActiveMQ中,持久化是值对消息数据的持久化.在ActiveMQ中,默认的消息是保存在内存中的.当内存容量不足的时候,或ActiveMQ正常关闭的时候,会将内存中的未处理的消息持久化到磁盘中.具体 ...
- MWC飞控增加声纳定高的方法(转)
源: MWC飞控增加声纳定高的方法
- 泡泡一分钟:eRTIS - A Fully Embedded Real Time 3D Imaging Sonar Sensor for Robotic Applications
eRTIS - A Fully Embedded Real Time 3D Imaging Sonar Sensor for Robotic Applications eRTIS - 用于机器人应用 ...
- k8s记录-使用kube-proxy让外部网络访问K8S service的ClusterIP (转载)
配置方式 kubernetes版本大于或者等于1.2时,外部网络(即非K8S集群内的网络)访问cluster IP的办法是:修改master的/etc/kubernetes/proxy,把KUBE_P ...