博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
session过期后自动跳转到登陆页
阅读量:6185 次
发布时间:2019-06-21

本文共 4213 字,大约阅读时间需要 14 分钟。

hot3.png

项目需要做一个自动登出的功能,查询了网上的资料,一开始准备用session监听做,按照下面方式配置监听器

1.在项目的web.xml文件中添加如下代码:

 监听器路径 

2.编写java类。

public class SessionListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent arg0) {  // session创建时执行  SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms");  String nowtimes = simpleFormat.format(new Date());  User u=null;  //System.out.println("执行。。 当前时间:"+nowtimes+"_"+u);  HttpSession ses= arg0.getSession();  String id=ses.getId()+"_"+ses.getCreationTime(); } public void sessionDestroyed(HttpSessionEvent arg0) {  // session失效时执行  SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms");  String nowtimes = simpleFormat.format(new Date());   //System.out.println("session失效了。。 结束时间: "+nowtimes); }}

配置完成后等session失效后成功进入sessionDestroyed方法,准备进行页面跳转操作,突然发现怎么写跳转,愣住了,继续上网请教大神,发现这个监听是做一些后台统计处理的,无法实现页面跳转的功能。

只能放弃这方法了,开始使用过滤器实现

1、web.xml中添加过滤器配置

        
sessionFilter
        
com.orchestrall.web.helper.session.SessionFilter
        
sessionFilter
        
/actions/*

2、新建SessionFilter类,实现Filter接口。

public class SessionFilterimplements Filter {    public void destroy() {        // TODO Auto-generated method stub    }    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        HttpServletRequest httpRequest = (HttpServletRequest) request;        HttpServletResponse httpResponse = (HttpServletResponse) response;        HttpSession session = httpRequest.getSession();        // 登陆url        String loginUrl = httpRequest.getContextPath() + "/admin/login.jsp";        String url = httpRequest.getRequestURI();        String path = url.substring(url.lastIndexOf("/"));        // 超时处理,ajax请求超时设置超时状态,页面请求超时则返回提示并重定向        if (path.indexOf(".action") != -1                && session.getAttribute("LOGIN_SUCCESS") == null) {            // 判断是否为ajax请求            if (httpRequest.getHeader("x-requested-with") != null                    && httpRequest.getHeader("x-requested-with")                            .equalsIgnoreCase("XMLHttpRequest")) {                httpResponse.addHeader("sessionstatus", "timeOut");                httpResponse.addHeader("loginPath", loginUrl);                chain.doFilter(request, response);// 不可少,否则请求会出错            } else {                String str = "
alert('会话过期,请重新登录');"                        + "window.top.location.href='"                        + loginUrl                        + "';";                response.setContentType("text/html;charset=UTF-8");// 解决中文乱码                try {                    PrintWriter writer = response.getWriter();                    writer.write(str);                    writer.flush();                    writer.close();                } catch (Exception e) {                    e.printStackTrace();                }            }        } else {            chain.doFilter(request, response);        }    }    @Override    public void init(FilterConfig arg0) throws ServletException {        // TODO Auto-generated method stub    }}

3、客户端JS,用于ajax请求session超时

对于jquery

$(document).ajaxComplete(function(event, xhr, settings) {      if(xhr.getResponseHeader("sessionstatus")=="timeOut"){          if(xhr.getResponseHeader("loginPath")){            alert("会话过期,请重新登陆!");            window.location.replace(xhr.getResponseHeader("loginPath"));          }else{              alert("请求超时请重新登陆 !");          }      }  });  

对于extjs的ajax请求

Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this);    function checkUserSessionStatus(conn,response,options){        if(response.getResponseHeader("sessionstatus") == 'timeout'){            if(response.getResponseHeader("loginPath")){                alert("会话过期,请重新登陆!");                window.top.location.href = response.getResponseHeader("loginPath");            }else{                alert("请求超时请重新登陆 !");            }        }    }

如果使某个ajax请求不受全局方法的影响,那么可以在使用$.ajax()方法时,将参数中的global设置为false,jquery代码如下:

$.ajax({    url:"test.html",    global:false//不触发全局ajax事件})

 

转载于:https://my.oschina.net/u/1432675/blog/297839

你可能感兴趣的文章
linux学习:持续集成篇--sonarqube代码质量管理平台的介绍与安装-04
查看>>
windos live writer 安装使用
查看>>
理解 Delphi 的类(十) - 深入方法[26] - 回调函数
查看>>
Linux中bamboo服务端安装配置
查看>>
使用shell和python分别实现简单菜单功能--打印当前系统状态信息
查看>>
sublime3143 许可证激活
查看>>
利用链式前向星在无权图中实现寻找两点最短路径
查看>>
在Linux上编译安装php开发环境(install apache)-2
查看>>
iBatis for Net 代码生成器(CodeHelper)附下载地址(已经升级为V 1.1)
查看>>
install_tomcat7
查看>>
Linux服务器的初步配置流程
查看>>
DB2的备份(backup)和恢复(RESTORE)数据库方法
查看>>
解析linux系统根目录结构
查看>>
PLSQL 常用函数
查看>>
我的友情链接
查看>>
异步动态加载贴图和模型
查看>>
商业周刊:Windows8引领PC远程删除时代
查看>>
3天3万视频课程的笔记
查看>>
写爬虫好辛苦
查看>>
django 中进行计算
查看>>