在开发JSP应用程序时,可以定义会话超时值,比如30分钟.
超时后,会话对象被销毁.此外,我可以通过编程方式使会话调用session.invalidate()无效.
由于我在HTTP会话中保存了一个复杂的Java对象,在使会话无效或让tomcat app服务器过期之前,我需要调用一个保存的对象方法来释放一些内存.当然,当用户单击注销按钮时,我可以以编程方式执行此操作.
我想要做的是拦截Tomcat应用服务器,当它要销毁所有过期的会话(30分钟或自定义)时,这样我就可以预处理保存在会话中的Java对象,调用特定的方法来释放内存.
可能吗?
如何以优雅的方式通过id或Web应用程序(Java 2 EE)中所有当前活动的http会话获取任何http会话?
目前我有一个WebSessionListener和一次创建会话我把它放进去ConcurrentHashMap() (map.put(sessionId, sessionObj)),一切都好,我可以随时通过会话ID从该地图检索HTTP会话,但看起来HttpSession对象永远不会完成...甚至会话无效地图仍然参考无效的会话对象...我也读过这篇文章,看起来WeakHashMap在我的情况下是不可接受的......
换句话说,我需要有可能查看任何HttpSession甚至获取当前所有活动HttpSession并从那里检索一些属性...
请告诉别人:)
我需要访问HttpSession对象,因为以下原因:
有时用户会做一些可能影响另一个并发用户工作的操作/请求,例如管理员应该禁用用户帐户但该用户当前正在使用该系统,在这种情况下我需要向管理员显示一条消息,例如"用户XXX当前使用系统"因此我需要检查是否有任何持有用户XXX凭据的HttpSession已存在且处于活动状态.所以这就是我需要这样的可能性来获得任何http会话甚至所有会话.
我当前的实现是:SessionManager知道所有会话(ConcurrentMap)和HttpSessionListener,它们将会话/删除会话放入SessionManager.
我担心可能出现的内存问题,我想与某人讨论这个问题,但目前我清楚地看到一切都应该正常工作,因为当调用sessionDestroyed()方法时,所有无效的会话都将从地图中删除...
非常感谢您的重播,但现在我明白这个问题只是想象力:)
当我的Object被绑定/无界限到HTTP的会话对象时,我如何得到通知.
我是java网络世界的新手,所以如果我说一些愚蠢的话,请原谅我.
我正在使用struts 2,我需要在关闭jsp时删除一个文件(位于服务器上).
有没有人知道怎么做?
提前致谢.
我遇到了类似的问题,并且已经知道我的侦听器类将在读取web.xml时被实例化.我在侦听器类中使用的函数很少,主servlet的doPost(它与数据库(mysql)交互以读取/写入有关用户的数据.)以及HttpSessionListener的方法.那么是什么阻止了容器加载监听器类.我收到404错误.
片段:
public class EntryServlet extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
PlayersList playa = new PlayersList(); //listener class
if(!playa.isExisting(params[3])){
if(params[1].equals("Register")){
playa.addPlayer(params);
}
}
else
out.println("Username already exists");
if(playa.isExisting(params[argUName],params[argUPwd])){
HttpSession session = request.getSession(true);
session.setMaxInactiveInterval(600);
HashMap playersMap = playa.getActivePlayers();
//code . .
}
else
out.println("Couldn't locate player Name!");
out.println(playa.getIn());
}
Run Code Online (Sandbox Code Playgroud)
听众课程:
public class PlayersList implements HttpSessionListener{
private Connection cn;
private Statement st;
PlayersList(){
try{
Class.forName("com.mysql.jdbc.Driver");
cn = DriverManager.getConnection("jdbc:mysql://localhost/homeDbse\'","root","");
st = cn.createStatement();
}
catch(ClassNotFoundException ce){} …Run Code Online (Sandbox Code Playgroud) 我刚刚尝试在我的测试Web应用程序中添加会话侦听器HttpSessionBindingListener和HttpSessionAttributeListener ; 它们都在我的测试对象中实现为:
public class MySessionListener implements HttpSessionBindingListener,HttpSessionAttributeListener
{
//implemented methods...
}
Run Code Online (Sandbox Code Playgroud)
事情是...
我试过像一个代码
session.setAttribute("name",new TestValue());
Run Code Online (Sandbox Code Playgroud)
因此,我希望调用HttpSessionBindingListener事件,valueBound(...)但我只调用了HttpSessionAttributeListener一个attributeAdded(...):(
而且,关于valueUnbound(...)方法态度与我提到的完全相同,我使用的代码就像
session.removeAttribute("name");
Run Code Online (Sandbox Code Playgroud)
...但我attributeRemoved(...)只是被称为同一个:S
我想尝试putValue()方法,但现在我正在观看HttpSession文档,其中说"putValue已弃用.从版本2.2开始,此方法被setAttribute(java.lang.String,java.lang.Object)取代"
所以我不知道为什么调用valueBound(...)或valueUnbound(...)不调用以及如何调用它们?
谢谢