2019独角兽企业重金招聘Python工程师标准>>>

对于session过期跳转的问题,很简单,就是一个过滤器,然后判断session为空?跳转:继续。但是对于ajax的请求,需要做特殊处理,见下面代码中的

// 此处考虑ajax操作session过期的操作,如果ajax请求过程中session过期,则指定过期状态码为:911.
String requestType = req.getHeader("X-Requested-With");

因为ajax请求的时候请求头是:X-Requested-With,so我们可以根据该请求头做session过期处理。

下面是过滤器的实现,可以作为参考。

package com.***.action.util;import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;/*** 标题:SessionFilter.* * 描述:session expire filter.* * @author lgscofield.*/
public class SessionFilter implements Filter {private final static Log LOGGER = LogFactory.getLog(SessionFilter.class);/*** 过滤器配置*/private FilterConfig filterConfig;/*** 超时页面*/protected String sessionTimeOutPage = null;/*** 某些url前缀列表(如: /css/*, /js/*, /images/***...)*/private List<String> ignoreURIs = new ArrayList<String>();/*** 静态资源列表(如: *.css, *.js, *.jpg...)*/private List<String> ignoreExts = new ArrayList<String>();/*** 个别动态资源(如: login.action, navigate.action, login.jsp...)*/private List<String> ignoreActions = new ArrayList<String>();/*** Default Construct.*/public SessionFilter() {super();}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {LOGGER.info("Init LogFilter Start.");this.filterConfig = filterConfig;// this.context = this.filterConfig.getServletContext();// startMonitor();// 某些URL前缀不予处理(例如 /img/***)String ignores = filterConfig.getInitParameter("ignore");if (ignores != null) {for (String ig : StringUtils.split(ignores, ',')) {ignoreURIs.add(ig.trim());}}// 某些URL扩展名不予处理(例如 *.jpg)ignores = filterConfig.getInitParameter("ignoreExts");if (ignores != null) {for (String ig : StringUtils.split(ignores, ',')) {ignoreExts.add('.' + ig.trim());}}// 某写页面及Action不予处理(例如login.jsp,login.action)ignores = filterConfig.getInitParameter("ignoreActions");if (ignores != null) {for (String ig : StringUtils.split(ignores, ',')) {ignoreActions.add(ig.trim());}}LOGGER.info("Init LogFilter End.");}@Overridepublic void destroy() {this.filterConfig = null;}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse resp = (HttpServletResponse) response;// HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);resp.setCharacterEncoding("UTF-8");HttpSession session = req.getSession(true);String requestUrl = req.getRequestURI();String redirectPath = req.getContextPath() + "/navigate.action";try {//过滤URL前缀/** for (String ignoreURI : ignoreURIs) { if (requestUrl.startsWith(ignoreURI)) { chain.doFilter(req, resp);* return; } }*///过滤URL后缀for (String ignoreExt : ignoreExts) {if (requestUrl.endsWith(ignoreExt)) {chain.doFilter(req, resp);return;}}// 过滤登陆action/jspfor (String ingonAction : ignoreActions) {if (isContains(requestUrl, ingonAction)) {chain.doFilter(req, resp);return;}}if (requestUrl.endsWith("/portal/") || requestUrl.endsWith("/portal")) {resp.sendRedirect(redirectPath);return;}} catch (SecurityException e) {String loginPage = req.getContextPath() + URLEncoder.encode(requestUrl, "utf-8");resp.sendRedirect(loginPage);}// 验证session是否过期Object user = session.getAttribute("userInfo");if (user == null) {// 此处考虑ajax操作session过期的操作,如果ajax请求过程中session过期,则指定过期状态码为:911.String requestType = req.getHeader("X-Requested-With");if (!StringUtils.isEmpty(requestType) && requestType.equalsIgnoreCase("XMLHttpRequest")) {resp.setStatus(911);resp.setHeader("sessionstatus", "timeout");resp.addHeader("loginPath", redirectPath);return;} else {// wrapper.sendRedirect(redirectPath);resp.sendRedirect(redirectPath);return;}} else {chain.doFilter(request, response);return;}}public static boolean isContains(String container, String regx) {boolean result = false;if (container.indexOf(regx) != -1) {return true;}return result;}}

最后就是页面上的处理了,此处应用了jquery全局事件处理机制:

$(function(){$.ajaxSetup({contentType: "application/x-www-form-urlencoded;charset=utf-8",cache: false,complete: function(XHR, TS){var resText = XHR.responseText;var sessionstatus = XHR.getResponseHeader("sessionstatus");var loginPath = XHR.getResponseHeader("loginPath");if (911 == XHR.status && "timeout" == sessionstatus) {// 此处使用了开源的消息确认框 $.messager.confirm('session过期', '您的会话已经过期,请重新登陆后继续操作!', function(confirm){if (confirm) {window.location.replace(loginPath);}});// 也可以使用下面的原生js的确认框,如果确认则跳转if(window.confirm('session过期', '您的会话已经过期,请重新登陆后继续操作!')) {window.location.replace(loginPath);}return;}}});
});

转载于:https://my.oschina.net/lgscofield/blog/471196

Ajax Session Timeout处理相关推荐

  1. dwz ajax session超时跳转登录页(struts2自定义阻碍器)

    为什么80%的码农都做不了架构师?>>>    培养奇才的先决前提是公共的聪明以前的项目用的是springsecurity3.0,session超时主动跳转的登录页(这个页面可配), ...

  2. php ajax session,Ajax处理用户session失效

    这次给大家带来Ajax处理用户session失效,Ajax处理用户session失效的注意事项有哪些,下面就是实战案例,一起来看一下. 在使用spingMVC的拦截器来处理用户session失效的问题 ...

  3. 关于无线的Idle Timeout和Session Timeout

    1.Session Timeout Session Timer的默认值为1800s,也就是30min. Session Timeout:当该计时器超时时,使得客户端强制发生重认证,这个时间是从客户端认 ...

  4. SAP Spartacus 会使用 Session timeout 吗?

    问题:Where to configure session timeout in Spartacus 答案 我假设您使用 Hybris OAuth 服务器的默认身份验证流程(密码流程). 在这种情况下 ...

  5. java forward 修改请求参数_聊聊springboot session timeout参数设置

    序 本文主要介绍下spring boot中对session timeout参数值的设置过程. ServerProperties spring-boot-autoconfigure-1.5.8.RELE ...

  6. ajax+time+out,关于ajax的timeout问题

    是 jQuery 的 ajax ? jQuery.ajax The timeout period starts at the point the $.ajax call is made; if sev ...

  7. kafka 中参数:session.timeout.ms 和 heartbeat.interval.ms的区别

    文章目录 1.heartbeat.interval.ms 2.heartbeat.interval.ms 与 session.timeout.ms 的对比 3.session.timeout.ms 和 ...

  8. php ajax session失效,PHP中解决ajax请求session过期退出登录问题

    1.session过期,如果直接是url请求,或者用户在打开的系统页面中直接清除缓存及cookie信息,可直接在php的入口文件中调用以下封装的方法,进行session信息判断以及页面的跳转,如: i ...

  9. Ajax Session失效跳转登录页面的方法

    在Struts应用中,我们发出的请求都会经过 相应的拦截器进行相关处理,一般都会有一个用户登录拦截(Session失效拦截):一般请求的话,如果Session失效时,我们会跳到登录页面,可是如果我们采 ...

  10. dwz ajax session超时跳转登录页(struts2自定义拦截器)

    1.定义struts2拦截器(网上例子很多) 代码如下: package rt.intercepter;import java.util.Map;import javax.servlet.http.H ...

最新文章

  1. dell服务器清空系统空间,PowerEdge 服务器上的内存配置错误。
  2. 3. 什么是icmp?icmp与ip的关系_「2020.12.3」黄俊捷热搜被爆料?郭俊辰交往女朋友?为什么三只跨年不合体?郝富申和王俊凯关系?Naomi和alracco?...
  3. 在账户确定类型KOFI没有找到总账科目
  4. 2020 年 AI 和机器学习的重要趋势是什么 ?
  5. 《集体智慧编程》笔记(1 / 12):集体智慧导言
  6. 步进电机五根线怎么接_步进驱动和伺服驱动的区别
  7. 企业级生产环境CICD入门
  8. 微信公众平台开发中提示“该公众号提供的服务出现故障”问题解决
  9. Ubuntu之hadoop非分布式(单机)和伪分布式安装
  10. 操作系统原理(哈工大-李治军老师)实验三系统调用
  11. ChromeDriver的浏览器版本不支持解决办法
  12. 错误:Mixed Content: The page at ‘https://XXX’ was loaded over HTTPS, but requested an insecure.......
  13. 计网考点 无线局域网
  14. could't excute 请求的操作需要提升 win32 error 740
  15. 百度移动优化:关于移动端点击图片放大有多少人注意?
  16. g6的minimap中的配置_g6 基本
  17. 设计原则:开闭原则(OCP)
  18. 【浅学数据结构】算法概念篇
  19. 边缘计算和大数据平台如何相结合?
  20. 第七次人口普查数据与城镇化

热门文章

  1. 第五章平稳过程(1)
  2. matlab之find函数
  3. mysql--id主键列乱了之后,重新排序
  4. python最常用的版本是_在下列选项中,( ) 是最常用的 Python版本,也称之为CIassicPython。_学小易找答案...
  5. kb2919355无法安装
  6. Raki的读paper小记:WaveTransformer: A Novel Architecture for Audio Captioning
  7. 70.爬楼梯 (力扣leetcode) 博主可答疑该问题
  8. python虚拟环境--virtualenv
  9. 【hihocoder 1554】最短的 Nore0061
  10. 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝