【问题标题】:Redirect user to specific page when user is inactive for a specified time当用户在指定时间内不活动时将用户重定向到特定页面
【发布时间】:2016-07-15 03:19:30
【问题描述】:

我想对我的 servlet 进行编程,以在用户 10 分钟不活动时阻止会话而不关闭,并将用户重定向到页面 sessionlocked.jsp

我测试了这段代码,但它不起作用。

session.setMaxInactiveInterval(10*60);
if (request.getSession(false) == null) {
    response.sendRedirect(url);
}

我怎样才能做到这一点?

【问题讨论】:

    标签: session redirect servlets servlet-filters


    【解决方案1】:

    作为documentation;

    setMaxInactiveInterval(int 间隔)

    指定 servlet 容器使该会话无效之前客户端请求之间的时间(以秒为单位)。

    所以setMaxInactiveInterval 方法不能满足您的需求,它会使会话无效。

    要向用户显示锁定的页面,您有两种选择;

    首先;

    使用过滤器检查会话时间,如果时间超过重定向到 锁定页面,否则重置时间。

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpSession session = ((HttpServletRequest) request).getSession(false);
        if (session == null) {
            // ((HttpServletRequest) request).getSession(true);
            // redirect to logout or anywhere you want, to create a session
            return;
        }
        // Check if filter also work for sessionlocked.jsp
        if (((HttpServletRequest) request).getRequestURL().toString().contains("sessionlocked")) {
            chain.doFilter(request, response); // no need to check sessionlocked
            return;
        }
        long lastAccessTime = session.getLastAccessedTime();
        long tenMinuteAsMilisecond = 10 * 60 * 1000;
        if (lastAccessTime + tenMinuteAsMilisecond > (new Date()).getTime()) {
            chain.doFilter(request, response); // session still not locked
        } else {
            ((HttpServletResponse) response).sendRedirect("sessionlocked.jsp");
        }
    }
    

    第二次(除了第一次,因为第一次尝试是在服务器端控制的);

    使用 javascript 倒计时,当时间结束时,将用户重定向到 锁定页面。

     window.onload = function() {
            setInterval(function() {
                window.location.replace("/sessionlocked.jsp");
                  }, 600000);
        }
    

    如果只需要servlet; (当用户与 servlet 交互时)

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession(false);
        if (session == null) {
            request.getSession(true);
            // redirect to logout or anywhere you want, to create a session
            return;
        }
        long lastAccessTime = session.getLastAccessedTime();
        long tenMinuteAsMilisecond = 10 * 1000;// to test lock time set to 10 seconds
        if (lastAccessTime + tenMinuteAsMilisecond > (new Date()).getTime()) {
            response.getOutputStream().print("Session not locked" + i++);
            // TODO for not locked code
        } else {
            response.getOutputStream().print("Session locked");
             //redirect to sessionlocked.jsp
        }
    }
    

    Servlet 输出(锁定时间设置为 10 秒);

    【讨论】:

    • 如果会话过期,过滤器尝试将不起作用(getSession() 会给你一个新的)。当客户端在同一会话中打开多个页面(选项卡/窗口)时,JS 尝试会给出奇怪的结果。当会话在服务器端过期时,这两种方法都不是立即重定向用户的正确方法。
    • @BalusC 我还在编辑答案,猜到并在代码上方添加注释,我认为答案不值得-1分,这是一个不耐烦的动作:)
    • 目前的答案是错误的。当然,如果帖子的更正方式能够真正回答和解决具体要求,并在提出变通办法而不是解决方案时描述所有可能的警告,那么反对票将被删除。
    • 我在几个场景下测试过,希望对Ghanesoft有所帮助。
    • 我想使用 servlet(服务器)而不是 javascript(客户端)来配置它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多