request.getRemoteUser() 如何工作以及存储远程用户名值?

How the request.getRemoteUser() works and the remote username value is stored?

我的应用程序中有 tomcat 身份验证(表单身份验证),身份验证成功后,我可以通过 servlet.where 中的 request.getRemoteUser() 方法获取用户名 我可以找到request.getRemoteUser() 代码 ?这是怎么回事?已设置和存储 RemoteUser 的位置。由于 http 请求是无状态的并且独立执行,这如何在所有后续请求中提供用户名??

为了处理身份验证,Tomcat中的每个上下文都有一个Valve that extends AuthenticatorBase,即:

  1. 尝试使用 HttpServletRequest
  2. 中的数据对用户进行身份验证
  3. 检查 URL、
  4. 的授权要求
  5. 如果需要身份验证但不存在,则向浏览器发送适当的响应,请求身份验证。对于大多数身份验证方法,这通常意味着 401 响应带有 WWW-Authenticate header 或 302 重定向到登录页面以进行表单身份验证。
  6. 如果存在身份验证,但访问未获授权,它会发送 403 响应。
  7. 否则调用 Request#setUserPrincipal 并继续下一个阀门。

有关详细信息,请查看 AuthenticatorBase#invoke 方法。

大部分认证方式都是基于浏览器发送的Authorizationheader(表单认证器使用请求参数)。

如果存在 session(例如,您调用了 HttpServletRequest#getSession),经过身份验证的用户将缓存在 session 中,后续请求将不再需要进行身份验证。您可以使用验证器阀门上的 alwaysUseSession 属性强制创建 session(参见 documentation)。服务器可以通过多种方法识别先前建立的session的存在:

  1. A JSESSIONID Cookie header 在请求中,
  2. 一个jsessionid路径参数在URL,
  3. 如果您使用 TLS,TLS session 也可用于检测适当的 HTTP session。