会话管理的超时设置,超时后页面自动跳转到user_login.jsp---sqringmvc项目+maven+jsp+spring

第一步:建立SessionListener

(1)建立SessionListener

该Listener包与mvc层包平行即可

建立SessionListener 集成 http的监听器的接口去

package com.vilicode.Listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;


@WebListener
public class SessionListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        // 会话创建时触发
        System.out.println("Session Created: " + se.getSession().getId());
        System.out.println("session created time:"+se.getSession().getCreationTime());
        se.getSession().setMaxInactiveInterval(300);
        se.getSession().setAttribute("sessionfiltername","sessiontimeout");
        SessionChecker.startSessionTimeoutChecker(se.getSession());

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {

        // 会话销毁时触发
        System.out.println("Session Destroyed: " + se.getSession().getId());


    }
}
该监听器会在session建立与摧毁是被启用的

session的超时时间的设置  session是一旦服务器启动,就创建server与client的连接的。

se.getSession().setMaxInactiveInterval(300);   //只需要设置足够长的会话超时的session时间就OK   这里是300=====五分钟

(2)session的监听器的内容执行者

这一块就是我们的每时每刻在监听session的监听器的内容执行者。

如果没啥需要执行的通知类的代码,  这里没必要写过多代码,也可以不写这一块代码。

package com.vilicode.Listener;

import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.Enumeration;
import java.util.Timer;
import java.util.TimerTask;

public class SessionChecker {

    public static void startSessionTimeoutChecker(HttpSession session) {
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                long date = new Date().getTime();

            }
        };

        Timer timer = new Timer();
        timer.schedule(task, 0, 1000); // 每秒检查一次
    }
}

第二步:建立session的过滤器

package com.vilicode.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.regex.Pattern;

@WebFilter(filterName = "sessionTimeoutFilter", urlPatterns ="/*")
public class SessionTimeoutFilter  implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }


    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
        String url=httpServletRequest.getRequestURI();

        if(url.contains("/index")||url.contains("/user_login.jsp")||url.contains("/user_register.jsp"))
        {
            chain.doFilter(httpServletRequest, httpServletResponse);

        }
        HttpSession session = httpServletRequest.getSession(false);//会话不存的话不会创建他的
        //session 会在一开始的时候就会自动生成  这是服务器端与客户端建立连接的时候  自动生成  以保护客户的信息与属性
        //我们在session创建的时候设置了 一个session的 key与calue属性为“sessionfiltername":"sessiontimeout"
        if (session == null || session.getAttribute("sessionfiltername") == null) {
            // 会话过期,重定向至登录页面
            String str = " <script language='javascript'>alert('会话过期,请重新登录');"
                    + "window.top.location.href='user_login.jsp';</script>";

            httpServletResponse.setContentType("text/html;charset=UTF-8");
            PrintWriter writer=httpServletResponse.getWriter();
            writer.write(str);
            writer.flush();

        } else {
            // 会话仍然有效,继续处理请求
            chain.doFilter(httpServletRequest, httpServletResponse);
        }


    }

    @Override
    public void destroy() {

    }
}

上述代码首先需要过滤掉首页与login页面就OK,其余解释看代码就OK。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值