如何配置 Tomcat 领域超时

How to configure Tomcat Realm timeout

我正在使用 Tomcat 9 和带有基本身份验证的 JNDIRealm 来验证用户。问题是,一旦用户关闭 Web 浏览器,他将再次被要求输入用户名和密码。这也是根据我可以找到的文档 Tomcat:

Once a user has been authenticated, the user (and his or her associated roles) are cached within Tomcat for the duration of the user's login. (For FORM-based authentication, that means until the session times out or is invalidated; for BASIC authentication, that means until the user closes their browser)

这种行为非常烦人,因为用户每次关闭浏览器后都必须登录。我希望用户登录缓存 1 周。只有这样才能对凭据提出质询。有什么办法可以改变这种默认行为吗?

在默认配置中,身份验证在 Tomcat 的会话期间被缓存(参见 authenticators 上的 cache 属性)。

如果您的应用程序 使用 HttpSessions(例如 REST API),验证器将尝试在没有它的情况下运行:

  • BASIC 身份验证器将依赖于浏览器在浏览器会话期间缓存用户提供的凭据的行为,
  • FORM 身份验证器 必须 使用 cookie,因此它总是创建一个 Tomcat 会话。

但是这种行为是可配置的:只需在应用程序的上下文文件中设置 BasicAuthenticatoralwaysUseSession 属性(或默认 conf/context.xml 文件以将设置应用于所有应用程序) :

<Context>
    <Valve
        className="org.apache.catalina.authenticator.BasicAuthenticator"
        alwaysUseSession="true"/>
    ...
</Context>

备注JSESSIONID cookie 本身默认在浏览器会话结束时过期(检查this answer),因此Tomcat的会话通常在您关闭浏览器时过期。您需要在应用程序的 web.xml 描述符(或 Tomcat 的默认 conf/web.xml 文件)中配置适当的 <max-age> 值。