1.方法一 :1.1使用filter 和ajaxsetup 对ajax进行拦截并跳转登录页面

 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException { HttpServletResponse hresponse = (HttpServletResponse)response;
HttpServletRequest hrequest = (HttpServletRequest)request;
HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response); String logonStrings = config.getInitParameter("logonStrings"); // 登录登陆页面
String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");// 没有登陆转向页面
String disabletestfilter = config.getInitParameter("disabletestfilter");// 过滤器是否有效
String reString = hrequest.getRequestURI();
if (disabletestfilter.toUpperCase().equals("Y")) { // 过滤无效
chain.doFilter(request, response);
return;
}
// User user = ( User ) hrequest.getSession().getAttribute("user");//判断用户是否登录
String session_key = (String) hrequest.getSession().getAttribute("token");
String username = (String) hrequest.getSession().getAttribute("username");
if ("".equals(session_key) || session_key == null) {
String[] logonList = logonStrings.split(",");
if (this.isContains(reString, logonList)) {// 对登录页面不进行过滤
chain.doFilter(request, response);
return;
}else{
request.setAttribute("username", null);
boolean isAjaxRequest = this.isAjaxRequest(hrequest);
if (isAjaxRequest) {
//系统的根url
chain.doFilter(request, response);
return;
}
wrapper.sendRedirect(redirectPath);
return;
}
}else {
if(username !=null || username .equals("")) {
Pattern pattern = Pattern.compile("/iad/");
Matcher matcher = pattern.matcher(reString);
Pattern pattern1 = Pattern.compile("/iad/views/login/login.jsp");
Matcher matcher1 = pattern1.matcher(reString);
if(matcher.matches() ||matcher1.matches()){
wrapper.sendRedirect("/iad/views/home/index.jsp");
return;
}else {
chain.doFilter(request, response);
return;
}
}else{
boolean isAjaxRequest = this.isAjaxRequest(hrequest);
if (isAjaxRequest) {
chain.doFilter(request, response);
return;
}
Pattern pattern = Pattern.compile(".*\\/views\\/login\\/login\\.jsp");
Matcher matcher = pattern.matcher(reString);
Pattern pattern2 = Pattern.compile(".*\\/oms/");
Matcher matcher2 = pattern2.matcher(reString);
// 是否是登陆页面
if (matcher.matches() || matcher2.matches()) {
request.setAttribute("username", username);
wrapper.sendRedirect("/iad/views/home/index.jsp");
return;
}
chain.doFilter(request, response);
return;
} } }

判断是否为ajax

  public static boolean isAjaxRequest(HttpServletRequest request) {
String header = request.getHeader("X-Requested-With");
if (header != null && "XMLHttpRequest".equals(header))
return true;
else
return false;
}

1.2  全局js代码 可以抽取公共js 引入到你想要的页面

 $.ajaxSetup( {
type: "POST" , // 默认使用POST方式
headers: { // 默认添加请求头
"Author": "CodePlayer" ,
"Powered-By": "CodePlayer"
} ,
error: function(xhr, textStatus, errorMsg){ // 出错时默认的处理函数
var sessionStatus = xhr.getResponseHeader('sessionstatus');
if(sessionStatus == 'timeout') {
var top = getTopWinow();
var ids=layer.alert("导入成功!");
window.location.href = "/iad/veiws/login/login.jsp";
} }
} );

总结: 这种方法的有个问题,就是ajax里面的error方法是一定走的, 提醒信息会出现两次

方法二:使用js定时器对前台的session进行查询(前提是你要将这个js放到公共页面)

  @ResponseBody
@RequestMapping("/loginCheck")
public Boolean loginCheck(HttpServletRequest request, HttpServletResponse response) { String session_key = (String) request.getSession().getAttribute("token");
String username = (String) request.getSession().getAttribute("username");
if (session_key == null || username == null) {
response.setHeader("sessionstatus", "timeout");
return false;
}
return true;
}
 var timeid=window.setInterval("checkSession()", 1000);
checkSession= function () {
$.ajax({
url: "../../loginCheck",
type: "POST",
dataType: "json",
success: function (result) {
if (result != true) {
window.clearInterval(timeid);
Ewin.alert({message: "由于您长时间没有操作, session已过期, 请重新登录"}).on(function (e) {
window.location.href = "/iad/veiws/login/login.jsp";
})
} }
}); };

总结:这个方法可以将定义时间延长可以两秒查一次,确定是首先1.你的系统要有公共的页面,2.定时查询可能导致系统变慢

session过期,拦截ajax请求并跳转登录页面的更多相关文章

  1. session过期时ajax请求刷新浏览器

    ajax前置处理实现异步请求session过期时跳转登录页面 function checkLogin(json) { if (typeof(json) === 'string' && ...

  2. shiro session过期后ajax请求跳转(转)

    配置了 Shrio框架,session也集成进去了 ,发现问题session会话过期,点击页面,一直请求失败.本来想集成拦截器,过滤器,但是已经用了shiro框架,sessionDestroyed 方 ...

  3. session超时跃出iframe并跳到登陆页面(转载)

    session超时跳出iframe并跳到登陆页面 在网页编程时,我们经常需要处理,当session过期时,我们要跳到登陆页面让用户登陆,由于我们可能用到IFrame框架,所以我们我登陆页面需要显示在整 ...

  4. 重写ajax方法实现异步请求session过期时跳转登录页面(转)

    一般我们会在过滤器里判断登录状态,如果没登录就跳转登录页面,过滤器java核心代码如下: UserItem loginUser = (UserItem)request.getSession().get ...

  5. MOCK.JS 生成随机数据,拦截 Ajax 请求

    mock.js 的用处 前后端分离 :让前端攻城师独立于后端进行开发. 增加单元测试的真实性 :通过随机数据,模拟各种场景. 开发无侵入 :不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响 ...

  6. Mock拦截ajax请求

    //mock拦截ajax请求 ,生成随机数据Mock.mock('./servlet/UserServlet?method=getUser',{ 'list|1-5':[{ 'username':'@ ...

  7. 登录超时,给出提示跳到登录页面(ajax、导入、导出)

    一.一般页面登录超时验证,可以用过滤器filter,如下: package com.lg.filter; import java.io.IOException; import javax.servle ...

  8. 详解springmvc控制登录用户session失效后跳转登录页面

    springmvc控制登录用户session失效后跳转登录页面,废话不多少了,具体如下: 第一步,配置 web.xml <session-config> <session-timeo ...

  9. 记一次IIS发布网站导致系统时常跳入登录页面的问题解决

    服务器:winserver2012R2 iis 发布网站后,正常浏览网页,时常跳到登录页面,第一反应session过期,因为登录信息都存在session,但session 都是默认配置过期时间为20分 ...

随机推荐

  1. [CQOI 2018]解锁屏幕

    Description 题库链接 给出平面上 \(n\) 个点,一开始你可以选任何一个点作为起点,接着对于每一个你在的位置,你可以选取一个未走过的点.将路径(线段)上所有的点均选上(包括起点终点),并 ...

  2. [HNOI 2018]毒瘤

    Description 题库链接 给出一个 \(n\) 个点 \(m\) 条边的无向图.求独立集个数. \(n\leq 10^5,n-1\leq m\leq n+10\) Solution 由于返祖边 ...

  3. windows主机网络信息获取程序设计

    掌握windows系统获取网络信息的各种API函数的功能与调用方法,掌握设计程序显示获取到相关网络信息的方法,掌握网络字节数据与主机字节数据之间的转换.掌握这些API函数调用的错误处理方法. 利用本地 ...

  4. js 中使用 #region #endregion

    vs 和 vs code 都是可以支持 js 使用 #region 折叠代码的:code 我就不说了 同理vs 的: 首先下载 vs 插件,插件路径:https://archive.codeplex. ...

  5. 【学习笔记】--- 老男孩学Python,day14 python内置函数大全

    参考:  https://www.cnblogs.com/pyyu/p/6702896.html http://www.runoob.com/python3/python3-built-in-func ...

  6. [转]关于浏览器css选择器性能优化

    作为一个前端开发, 我觉得很有必要了解浏览器对css选择器的解析,因为这个关系到页面的渲染,高效的方式.避开开销大的方式这些无疑为网站加载缩短了时间. 最近在新的项目中陷入了一个误区,也是出于对jqu ...

  7. setTimeout OR setInterval?

    setTimeout 和setInterval从字面上应该是可以知道其大意的.timeout:延时:interval:间隔: 两者的区别就像是它们自己的英文解释一样:setTimeout是延时执行,并 ...

  8. 使用IntelliJ IDEA配置Erlang开发环境

    这篇文章比较详细,感谢作者,拷贝过来做个记录 ————————————————————————————————————————————————————————————————————————————— ...

  9. 润乾报表JSF FORM 标签中使用填报表解决方案

     需求 润乾报表的标签需要在jsf页面中和其他填报控件一起使用,润乾报表负责展现录入部分数据,并且这部分数据和页面的其它控件的数据存在前台和后台的交互. 问题 润乾报表在前台会生成自己的form, ...

  10. opengl学习笔记

    准备: 1.准备资源:从GLEW1.13.0下载GLEW,并且解压出glew-1.13.0目录.从FreeGLUT官网下载3.0.0版本.直接从这里下的编译后的FreeGLUT,选for MSVC,下 ...