session过期,拦截ajax请求并跳转登录页面
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请求并跳转登录页面的更多相关文章
- session过期时ajax请求刷新浏览器
ajax前置处理实现异步请求session过期时跳转登录页面 function checkLogin(json) { if (typeof(json) === 'string' && ...
- shiro session过期后ajax请求跳转(转)
配置了 Shrio框架,session也集成进去了 ,发现问题session会话过期,点击页面,一直请求失败.本来想集成拦截器,过滤器,但是已经用了shiro框架,sessionDestroyed 方 ...
- session超时跃出iframe并跳到登陆页面(转载)
session超时跳出iframe并跳到登陆页面 在网页编程时,我们经常需要处理,当session过期时,我们要跳到登陆页面让用户登陆,由于我们可能用到IFrame框架,所以我们我登陆页面需要显示在整 ...
- 重写ajax方法实现异步请求session过期时跳转登录页面(转)
一般我们会在过滤器里判断登录状态,如果没登录就跳转登录页面,过滤器java核心代码如下: UserItem loginUser = (UserItem)request.getSession().get ...
- MOCK.JS 生成随机数据,拦截 Ajax 请求
mock.js 的用处 前后端分离 :让前端攻城师独立于后端进行开发. 增加单元测试的真实性 :通过随机数据,模拟各种场景. 开发无侵入 :不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响 ...
- Mock拦截ajax请求
//mock拦截ajax请求 ,生成随机数据Mock.mock('./servlet/UserServlet?method=getUser',{ 'list|1-5':[{ 'username':'@ ...
- 登录超时,给出提示跳到登录页面(ajax、导入、导出)
一.一般页面登录超时验证,可以用过滤器filter,如下: package com.lg.filter; import java.io.IOException; import javax.servle ...
- 详解springmvc控制登录用户session失效后跳转登录页面
springmvc控制登录用户session失效后跳转登录页面,废话不多少了,具体如下: 第一步,配置 web.xml <session-config> <session-timeo ...
- 记一次IIS发布网站导致系统时常跳入登录页面的问题解决
服务器:winserver2012R2 iis 发布网站后,正常浏览网页,时常跳到登录页面,第一反应session过期,因为登录信息都存在session,但session 都是默认配置过期时间为20分 ...
随机推荐
- 再springMVC中自定义文件上传处理解决与原spring中MultipartResolve冲突问题
相信很多朋友再用springmvc时都遇见了一个问题,那就是自带的获取上传的东西太慢,而且不知道如何修改,其实不然,spring框架既然给我们开放了这个接口,就一定遵从了可扩展性的原则,经过查看org ...
- C#.NET下转换泛型列表为JSON格式
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Te ...
- IOS第三方之SVProgressHUD
这个第三方和MBProgressHUD差不多,也挺简单的. // // ViewController.m // ProgressHUD // // Created by City--Online on ...
- python单链表
#!/usr/bin/env python3 # -*- coding:utf-8 -*- class LNode: """ 结点类 """ ...
- Linq学习教程
http://www.cnblogs.com/foundation/archive/2009/01/05/1369371.html
- HTML的map-area的使用
使用背景 在把设置图转成页面的时候,时常会遇到这种情况:一张小图片上有好多个可以点击的小图标,按常规的处理方法是把这一个一个的小图切出来,然后每个加个a标签进行跳转,但是这样会非常的浪费时间,而且会增 ...
- eclipse查看源码
通常eclipse中按住ctrl+左键单击,可以查看源码,很方便学习使用 如果看不到源码,需要简单的设置 设置源码 window—preference--Java—Installed JREs –jr ...
- 边框阴影box-shadow
边框的阴影: 参数说明: box-shadow:1px 2px 3px 4px #ccc inset: 1px 从原点开始,沿x轴正方向的长度(倘若为负值,为沿x轴负方向的长度) 2px 从原点开始, ...
- [日常] Linux使用diff来比较目录
Linux diff比较两个目录的不同: diff dir1 dir2 -urNaq -a --text Treat all files as text. -u -U NUM --unifi ...
- 泛型通配符extends与super的区别
<? extends T>限定参数类型的上界:参数类型必须是T或T的子类型 <? super T> 限定参数类型的下界:参数类型必须是T或T的超类型 总结为: <? ex ...