【问题标题】:Check Database value,when there is no interaction of user with session检查数据库值,当用户与会话没有交互时
【发布时间】:2012-07-10 07:10:19
【问题描述】:

我已经编写了一个 test.jsp、web.xml 和会话监听器。对于会话超时,我正在使用 HttpSessionListener 功能。当没有用户与会话交互时,我的会话在 1 分钟后失效。 使用技术:JSP、Servlet JSP

<%@ page import="java.util.List"%>
<%@ page import="java.util.ArrayList"%>
<html>
    <head>
        <title>Servlet Session Listener example</title>
    </head>
    <body>
        <h2>Add User Screen</h2>

        <span style="float: right"> 
            <a href="DestroySession.jsp">Destroy this session</a>
             </span>

        <form method="post" action="AddUser.jsp">
            <h3>Enter Username to Add in List</h3>
            <input type="text" name="user"/>
            <input type="submit" value="Add User"/>
        </form>

    <%
        List<String> users = (List<String>)session.getAttribute("users");
        for(int i=0; null!=users && i < users.size(); i++) {
            out.println("<br/>" + users.get(i));
        }
    %>
    </body>
</html>

Java 代码

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

public class SessionListener implements HttpSessionListener {
    private int sessionCount = 0;

    public void sessionCreated(HttpSessionEvent event) {
        synchronized (this) {
            sessionCount++;
        }

        System.out.println("Session Created: " + event.getSession().getId());
        System.out.println("Total Sessions: " + sessionCount);
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        synchronized (this) {
            sessionCount--;
        }
        System.out.println("Session Destroyed: " + event.getSession().getId());
        System.out.println("Total Sessions: " + sessionCount);
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
    <display-name>SessionListener</display-name>
    <distributable/>
    <listener>
        <listener-class>SessionListener</listener-class>
    </listener>
    <session-config>
        <session-timeout>1</session-timeout>
    </session-config>
</web-app>

我的要求是:当用户与会话 1 分钟没有交互时,我想根据某些数据库值使会话无效。如果数据库值为 false,则不应使会话无效。如果数据库值为真,则会话应无效。但是 1 分钟后(当用户与会话没有交互时),SessionListener 类的 sessionDestroyed 函数被自动调用,我无法检查数据库值。我该怎么做?

【问题讨论】:

  • 您需要检查的数据库值可能会在会话的生命周期内发生变化?
  • 感谢您的回复!是的,这个数据库值正在被其他应用程序不断更新,所以它可以是任何值在任何时候真或假

标签: jsp session servlets invalidation


【解决方案1】:

你应该试试这个:

  • 将会话添加到自定义管理线程
  • 自定义管理线程应定期执行以下步骤。
    • 让自定义管理线程读取 DB 值
    • 如果无效会话在 DB 中被禁用,让管理线程使用setMaxInactiveInterval 增加会话超时值。值-1 表示Never Invalidate.
    • 如果在 DB 中启用了无效会话,则让管理线程通过在 setMaxInactiveInterval 中设置较小的值来减少会话超时值。

【讨论】:

  • 你能指导我看一段代码吗,或者你能给我你的代码或工作示例来说明自定义管理线程(不是数据库检索)
  • 嗯,给我一些时间,我会尽力给你一些东西。
猜你喜欢
  • 1970-01-01
  • 2014-05-04
  • 2010-11-11
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多