最近研究WEB页面锁屏,发现一个方法就是去后台验证session的LastAccessedTime和当前时间比较是否超过最大的约束。但是关键是每次去验证LastAccessedTime后会发现LastAccessedTime修改成当前时间了。就是说每次的AJAX验证都会激活LastAccessedTime更新,这样反而达不到超时锁屏的目的了。
看了Tomcat的源代码发现我们的sessaion的实例都是StandardSessionFacade,而StandardSessionFacade里面的真正的seesion实例是StandardSession,他的LastAccessedTime是保护私有与,没有显示的set方法,无奈只能霸王硬上弓了,反射修改吧。
[code="java"]
public static void keepSessionLastAccessTime(StandardSessionFacade session)
{
try
{
long oldTime = session.getLastAccessedTime();
Field field = StandardSessionFacade.class.getDeclaredField("session");
boolean old1 = field.isAccessible();
field.setAccessible(true);
StandardSession ss = (StandardSession)field.get(session);
Field thisAT = StandardSession.class.getDeclaredField("thisAccessedTime");
boolean old2 = thisAT.isAccessible();
thisAT.setAccessible(true);
thisAT.setLong(ss, oldTime);
// 访问限制倒回
field.setAccessible(old1);
thisAT.setAccessible(old2);
}
catch (SecurityException e)
{
e.printStackTrace();
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
catch (Throwable e)
{
e.printStackTrace();
}
}
[/code]
关于Tomcat的LastAccessedTime
最新推荐文章于 2021-11-07 23:09:44 发布