对于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(); } @Override public 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."); } @Override public void destroy() { this.filterConfig = null; } @Override public 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/jsp for (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; } } }); });
相关推荐
request.setAttribute("message", "Session timeout!"); response.sendRedirect(response.encodeRedirectURL("/ajaxDone.jsp"); else { response.sendRedirect(response.encodeRedirectURL(this.loginUrl + ...
"session timeout/logout using PHP and AJAX"是一个关于如何在Web应用中自动检测并处理用户无活动时的登录状态的话题。下面将详细阐述这个主题的相关知识点。 首先,**会话(Session)**是Web服务器用来跟踪用户...
NULL 博文链接:https://ait.iteye.com/blog/1867548
当检测到 `sessionstatus` 为 `timeout` 时,将执行相应的处理,如跳转到登录页面: ```javascript // 全局的AJAX访问,处理AJAX请求时session超时 $.ajaxSetup({ contentType : "application/x-...
如果检测到Session已超时,我们可以自定义一个响应头,例如`sessionstatus`,并将值设置为"timeout",以此告知客户端Session已超时。以下是一个简单的Filter示例: ```java public void doFilter(ServletRequest ...
response.sendError(601, "session timeout."); return false; } ``` 在前端,我们需要监听Ajax请求的完成事件,并检查响应头中的`sessionStatus`字段。如果其值为`timeout`,则提示用户重新登录,并重定向到登录...
如果发现这是一个Ajax请求,我们就设置响应头`sessionstatus`为"timeout",而不是执行重定向。 接下来是前端JavaScript部分的处理,主要使用jQuery的Ajax设置。我们可以通过全局的`ajaxSend`或`ajaxSetup`事件来...
if (xhr.responseText && xhr.responseText.indexOf("{sessionState:timeout}") != -1) { // 会话已过期,跳转到登录页面 window.location.href = "/login"; } } }); }); ``` 通过上述方法,我们能够在不刷新...
alert("Your session will timeout in " + Math.round((timeout_sec - warn_sec) / 60000) + " minute, please click a button or navigate to another page to refresh your session before it expires.");...
会话超时提示Rails 5 Engine在会话即将超时时...session_timeout_prompter需要css: *= require session_timeout_prompter注意:当前依赖jQuery进行ajax /事件处理。用法在布局或任何要显示超时提示的页面上的body标签
<session-timeout>30</session-timeout> </session-config> 2. 在程序中通过servlet接口直接修改 通过以下代码也可以设置session的有效时间为30分钟(1800秒): HttpSession session=request.getSession(); session...
当检测到`sessionstatus`为"timeout"时,显示提示信息并重定向用户到登录页面: ```javascript Ext.Ajax.on('requestcomplete', checkSessionStatus, this); function checkSessionStatus(conn, response, options...
2. 如果`findHtml ,说明是Ajax请求,那么在session过滤器中,响应头添加`sessionstatus`为`timeout`,并返回一个包含错误信息的JSON对象,指明会话超时和重定向URL: ```java response.addHeader("sessionstatus...
<session-timeout>30</session-timeout> </session-config> ``` 2. **JavaScript心跳检测**:客户端可以通过定期发送Ajax请求(心跳检测)来保持Session活动。每当服务器接收到心跳请求时,就会刷新Session的过期...
- 如果是Ajax请求,设置响应头"sessionstatus"为特定值(例如,`ConstantsKey.MSG_TIME_OUT`),表示Session已过期。不返回任何结果字符串,这样Struts2不会尝试渲染任何结果视图。 - 如果是普通请求,返回`...
if (status === 'timeout' || xhr.status === 302) { window.location.href = '/login.html'; // 重定向到登录页面 } else if (_error) { _error.apply(this, arguments); } }; return _ajax.apply(this, ...
timeout: 1000, error: function() { alert('sorry, server is busy now!'); }, success: function(comments_data) { if (comments_data == 1) { el.createDialog(opts); j.startOver(); } else { var sql...
由于Session本身是在服务器端管理的,因此,这个库可能通过定时发送Ajax请求到服务器,获取Session信息,然后在客户端处理和展示。 描述中提到的“采用纯js实现,可以动态监测Web网页Session超期的个数”,意味着...