防止session过期的方式 不断刷新页面

本文介绍了一种通过在页面上添加隐藏的Iframe或图片,并利用JavaScript定时刷新的方法来防止Session过期的技术方案。该方法简单实用,适用于需要长时间保持用户会话的应用场景。

/*
    设计思路:
    1. 在架构中添加一个隐藏图片或Iframe
    2. 可以设定间隔时间,监控Session是否快超时
    3. 在临Session快超时时,刷新Iframe 或图片,使得Session始终起作用
*/

<script type="text/javascript">
   
    // 初始化时间,可以将time 设定为 Session 初始值,下面举例为 2
    var time = 2;
   
    // 定时刷新Iframe 或 图片
    function TimeInterval()
    {
        time--;
        if (time == 1)
        {
            // HiddenField1.ClientID 为隐藏的Iframe (也可以是图片,给图片加空链接实现)
            document.getElementById("<%=HiddenField1.ClientID %>").value = "";
            time = 2;
        }
    }
   
    /*
       定时执行:    setInterval()
       参数1 :     要执行的Function - TimeInterval()
       参数2 :     间隔多长时间执行一次,以毫秒为单位,60000毫秒/1000 = 60秒(1分钟)
    */

    setInterval("TimeInterval()", 60000);

</script>

在使用 session 作用域防止重复登录时,可采用以下方法处理 session 过期情况: ### 1. 设置合理的过期时间 可通过 `setMaxInactiveInterval` 方法设置 Session过期时间,以平衡安全性与用户体验。例如,设置 Session过期时间为 30 分钟: ```java HttpSession session = request.getSession(); session.setMaxInactiveInterval(60 * 30); // 设置Session过期时间为30分钟 ``` ### 2. 检测 Session 过期并重定向 在用户访问需要登录的页面时,可在过滤器或拦截器中检测 Session 是否过期。若过期,将用户重定向到登录页面。示例代码如下: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; public class LoginFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; HttpSession session = httpRequest.getSession(false); if (session == null || session.getAttribute("isLoggedIn") == null) { // Session 过期或未登录,重定向到登录页面 httpResponse.sendRedirect("/login"); return; } // Session过期,继续处理请求 chain.doFilter(request, response); } // 其他方法实现省略 } ``` ### 3. 提供自动刷新机制 可使用 JavaScript 定时向服务器发送请求,以刷新 Session过期时间。示例代码如下: ```javascript function refreshSession() { const xhr = new XMLHttpRequest(); xhr.open('GET', '/refreshSession', true); xhr.send(); } // 每 15 分钟刷新一次 Session setInterval(refreshSession, 15 * 60 * 1000); ``` 在服务器端,处理 `/refreshSession` 请求以刷新 Session过期时间: ```java import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; @WebServlet("/refreshSession") public class RefreshSessionServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); if (session != null) { // 刷新 Session过期时间 session.setMaxInactiveInterval(60 * 30); } response.getWriter().println("Session refreshed."); } } ``` ### 4. 记录登录状态到数据库 除了在 Session 中记录登录状态,还可将登录状态记录到数据库中。当 Session 过期时,可从数据库中获取用户的登录状态,以确定用户是否需要重新登录。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值