java网站中session 有默认的过期时间吗?

java网站中session 有默认的过期时间吗?,第1张

程序中session都有一个默认的过期时间,其中tomcat中的默认时间为30分钟,根据需要我们可以去手动设置session的过期时间,以下是设置session的过期时间的三个方法:\x0d\x0a\x0d\x0a1.在tomcat-->conf-->conf/web.xm中的中设置:\x0d\x0a\x0d\x0a \x0d\x0a30\x0d\x0a\x0d\x0a\x0d\x0a2.在项目的web.xml中定义:\x0d\x0a\x0d\x0a \x0d\x0a 20 \x0d\x0a \x0d\x0a\x0d\x0a 注:20则设置过期时间为20分钟 测试通过\x0d\x0a\x0d\x0a3.在程序中定义:\x0d\x0a\x0d\x0asession.setMaxInactiveInterval(30*60);\x0d\x0a\x0d\x0a 设置单位为秒,设置为-1永不过期

1、ZSet 实现方式

通过 ZSet 实现定时任务的思路是,将定时任务存放到 ZSet 集合中,并且将过期时间存储到 ZSet 的 Score 字段中,然后通过一个无线循环来判断当前时间内是否有需要执行的定时任务,如果有则进行执行,具体实现代码如下:

import redis.clients.jedis.Jedis

import utils.JedisUtils

import java.time.Instant

import java.util.Set

public class DelayQueueExample {

private static final String _KEY = "DelayQueueExample"

public static void main(String[] args) throws InterruptedException {

Jedis jedis = JedisUtils.getJedis()

// 30s 后执行

long delayTime = Instant.now().plusSeconds(30).getEpochSecond()

jedis.zadd(_KEY, delayTime, "order_1")

// 继续添加测试数据

jedis.zadd(_KEY, Instant.now().plusSeconds(2).getEpochSecond(), "order_2")

jedis.zadd(_KEY, Instant.now().plusSeconds(2).getEpochSecond(), "order_3")

jedis.zadd(_KEY, Instant.now().plusSeconds(7).getEpochSecond(), "order_4")

jedis.zadd(_KEY, Instant.now().plusSeconds(10).getEpochSecond(), "order_5")

// 开启定时任务队列

doDelayQueue(jedis)

}

/**

* 定时任务队列消费

* @param jedis Redis 客户端

*/

public static void doDelayQueue(Jedis jedis) throws InterruptedException {

while (true) {

// 当前时间

Instant nowInstant = Instant.now()

long lastSecond = nowInstant.plusSeconds(-1).getEpochSecond()

// 上一秒时间

long nowSecond = nowInstant.getEpochSecond()

// 查询当前时间的所有任务

Set data = jedis.zrangeByScore(_KEY, lastSecond, nowSecond)

for (String item : data) {

// 消费任务

System.out.println("消费:" + item)

}

// 删除已经执行的任务

jedis.zremrangeByScore(_KEY, lastSecond, nowSecond)

Thread.sleep(1000)// 每秒查询一次

}

}

}

登录后复制

2、键空间通知

我们可以通过 Redis 的键空间通知来实现定时任务,它的实现思路是给所有的定时任务设置一个过期时间,等到了过期之后,我们通过订阅过期消息就能感知到定时任务需要被执行了,此时我们执行定时任务即可。

默认情况下 Redis 是不开启键空间通知的,需要我们通过 config set notify-keyspace-events Ex 的命令手动开启,开启之后定时任务的代码如下

你可以试试这么做

web.xml

<listener>

<listener-class>

com.listener.SessionListener

</listener-class>

</listener>

<session-config>

<session-timeout>1</session-timeout>

</session-config>

java

public class SessionListener implements HttpSessionListener{

public void sessionCreated(HttpSessionEvent event) {

HttpSession ses = event.getSession()

String id=ses.getId()+ses.getCreationTime()

SummerConstant.UserMap.put(id, Boolean.TRUE)//添加用户

}

public void sessionDestroyed(HttpSessionEvent event) {

HttpSession ses = event.getSession()

String id=ses.getId()+ses.getCreationTime()

synchronized (this) {

SummerConstant.USERNUM-- //用户数减一

SummerConstant.UserMap.remove(id)//从用户组中移除掉,用户组为一个map

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7724567.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存