4

私はtest.jsp、web.xml、およびセッションリスナーを作成しました。セッションタイムアウトHttpSessionListenerには、機能を使用しています。セッションとのユーザー対話がない場合、1分後にセッションが無効になります。使用技術:JSP、サーブレット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 の場合、セッションは無効化されません。データベースの値が true の場合、セッションを無効にする必要があります。しかし、1分後(ユーザーとセッションのやり取りがない場合)、SessionListenerクラスのsessionDestroyed関数が自動的に呼び出され、データベースの値を確認できません。これどうやってするの?

4

1 に答える 1

3

これを試してください:

  • セッションをカスタム管理スレッドに追加します
  • カスタム管理スレッドは定期的に以下の手順を実行する必要があります。
    • カスタム管理スレッドが DB 値を読み取れるようにします
    • DB でセッションの無効化が無効になっている場合は、管理スレッドが を使用してセッション タイムアウト値を増加させますsetMaxInactiveInterval。値の-1 意味Never Invalidate.
    • DB でセッションの無効化が有効になっている場合は、管理スレッドが でより小さな値を設定して、セッションのタイムアウト値を削減できるようにしsetMaxInactiveIntervalます。
于 2012-07-10T07:19:25.290 に答える