Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在sessionCreated方法中检索用户输入的数据_Java_Jsp_Tomcat_Servlets - Fatal编程技术网

Java 如何在sessionCreated方法中检索用户输入的数据

Java 如何在sessionCreated方法中检索用户输入的数据,java,jsp,tomcat,servlets,Java,Jsp,Tomcat,Servlets,我有一个登录页面,要求输入用户名和密码。单击登录按钮,web页面将用户名和密码作为参数发送到登录servlet(我使用的是tomcat)。然后,我使用request.getSession()创建一个会话 我有一个sessionListener类(实现了HttpSessionListener),在这个类中我重写了sessionCreate()和sessionDestroyed()方法。我还在web.xml文件中创建了侦听器条目 我的问题是,我想访问sessionCreated()方法中的usern

我有一个登录页面,要求输入用户名和密码。单击登录按钮,web页面将用户名和密码作为参数发送到登录servlet(我使用的是tomcat)。然后,我使用
request.getSession()创建一个会话

我有一个sessionListener类(实现了
HttpSessionListener
),在这个类中我重写了
sessionCreate()
sessionDestroyed()
方法。我还在web.xml文件中创建了侦听器条目

我的问题是,我想访问
sessionCreated()
方法中的username请求参数,以便在创建新会话时将用户名写入mysql数据库


基本上,是否有任何方法可以访问会话侦听器中用户输入的参数?请建议如何实现此目的。

在Servlet中将用户名和密码(从
HttpServletRequest
获取)设置为
HttpSession

session.setAttribute("username", uname);
session.setAttribute("password", passwd);
在您的
HttpSessionListener
中,使用

String uname = (String) session.getAttribute("username");
String pwd  = (String) session.getAttribute("password");

谢谢@sanbath帮助我。以下是我完成这项工作的方法

我在servlet本身中添加了代码,以将登录的用户名插入数据库,因为我无法在
sessionCreated()
方法中执行此操作(此时没有可用的会话属性)

对于在会话失效时删除用户名,我只是从
sessionDestroyed()
方法的
HttpSessionEvent
参数中获取会话属性详细信息。由于username属性将可用,我可以从DB中的logged-in-users表中删除它

public void sessionDestroyed(HttpSessionEvent e) {
    System.out.println("session destroyed");
    System.out.println("username is "+e.getSession().getAttribute("user"));
}

@桑巴斯:谢谢,但是。。。。每当我发出语句request.getSession()时,就会调用sessionCreated()方法。这是我第一次为任何登录创建会话。将在调用sessionCreated()方法后设置属性。因此,我不能仅仅在sessionCreated方法中获取会话属性。然后我觉得这个设计有缺陷。访问请求参数的一种方法是通过
HttpServletRequest
访问,当您在
HttpSessionListener
的任何方法中时,您无法访问请求,因为此时可能没有请求(它已被触发)。因此,我建议将保存逻辑移动到servlet。您可以有一个专用的servlet来创建会话,您可以在那里自己更新DB。@Sanbath:是的,我可以将代码移动到servlet,但是,每当新会话自动过期时,我将无法更新DB。假设,用户登录,我使用servlet在数据库中的loggedIn user表中创建一个条目,然后用户什么也不做,会话过期('session.Invalidate()'被调用)。在这种情况下,我将无法从loggedinusertable中删除用户,因为我不知道会话何时过期。因此,我希望在会话侦听器事件中处理此逻辑。现在,当会话失效并且调用侦听器的sessionDestroyed时,您将提前设置用户名;获取该用户名,然后现在从侦听器中进行DB调用以删除它。该问题仅在创建DB条目时存在。。不删除,因为删除时您在会话中有用户名。不,它不起作用,因为用户名在
sessionDestroyed()
方法中可用,
HttpServletRequest
实例也应该可用。我看不到任何方法将http请求实例传递给
sessionDestroyed()
方法。难道没有任何方法可以将值传递给Lisetner吗?