Servlet 无法区分请求是由某个脚本还是由人生成的,因为两个请求都来自同一个浏览器,因此发送相同的 JSESSIONID。因此,您必须标记这些请求以区分其来源。您可以通过一些标头或请求参数来标记它们。
我喜欢您将访问时间存储在会话变量中的想法(它将在 servlet 会话到期时捎带)您的算法将在这种情况下:
if isUser(request){
session.lastRobotAccess == null
}else{
if (session.lastRobotAccess == null) {
session.lastRobotAccess = current_time
} else {
if(current_time - session.lastRobotAccess > session.timeout){
session.invalidate
}
}
}
当请求到达 servlet 容器时,它首先由过滤器(如果您已定义)处理,然后由 servlet 处理。过滤器适用于:
过滤器的一个常见场景是您希望对一组 servlet 的请求或响应应用预处理或后处理,而不仅仅是单个 servlet。如果您只需要修改一个 servlet 的请求或响应,则无需创建过滤器 — 只需直接在 servlet 本身中执行所需的操作即可。
由于您可以从过滤器访问会话,因此它们更适合您的逻辑。额外的检查不会污染 servlet 的逻辑,并且可以将其应用到其他 servlet。过滤器也是 servlet 规范的一部分,因此它适用于任何容器。
你已经知道这些了,但我只是把它们放在“纸上”:-D