我正在使用数据库来存储用户详细信息,包括用户名和密码。它还有一个Security_check
默认为“logged_out”的列。
每当用户登录时,我都会Security_check
从验证用户(servlet)的页面将值修改为“logged_in”。每当用户点击注销按钮时,我都会明确更改Security_check
为其默认值。
但是当用户在没有注销的情况下关闭浏览器时,就会出现一个大问题,因为该Security_check
用户的列值仍然是“logged_in”,之后当该用户厌倦登录时,他们会收到一条错误消息,指出您正在已经登录(因为我Security_check
在允许任何用户登录之前检查了,在这种情况下他们已经登录)。所以他无法登录,也无法注销,因为当他关闭浏览器时会话已过期。所以我该怎么做?
下面是 HttpSessionListener 类的代码,它不起作用:
package com.svc.session;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.sql.*;
import javax.servlet.http.HttpSession;
public class Session_Invalidator implements HttpSessionListener
{
public Session_Invalidator()
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(Exception e)
{
}
}
public void sessionCreated(HttpSessionEvent se)
{
}
public void sessionDestroyed(HttpSessionEvent se)
{
HttpSession session = se.getSession();
String uName = session.getAttribute("userName").toString().trim();
Connection con = null;
PreparedStatement stmt = null;
try
{
// i am using a space between the colon and odbc because if
// I don't it will be converted to smile, so ignore the space
con = DriverManager.getConnection("jdbc: odbc:CMS","","");
stmt = con.prepareStatement("update Users set security_check=default where login_name=?");
stmt.setString(1, uName);
int no = stmt.executeUpdate();
} catch(Exception e)
{
}
}
}