session过期后自动跳转到登陆页

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

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

<!--添加Session监听器-->
<listener> <listener-class> 监听器路径 </listener-class> </listener>

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中添加过滤器配置

<filter>         <filter-name>sessionFilter</filter-name>         <filter-class>com.orchestrall.web.helper.session.SessionFilter</filter-class> </filter> <filter-mapping>         <filter-name>sessionFilter</filter-name>         <url-pattern>/actions/*</url-pattern> </filter-mapping>

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 = "<script language='javascript'>alert('会话过期,请重新登录');"                         + "window.top.location.href='"                         + loginUrl                         + "';</script>";                 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

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

对于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://www.cnblogs.com/alexxs/p/5822235.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值