Java 一旦执行登录,如何管理j_用户名值?

Java 一旦执行登录,如何管理j_用户名值?,java,authentication,jakarta-ee,Java,Authentication,Jakarta Ee,我有一个web应用程序,它具有表单类型的身份验证机制,因此当用户请求一个受保护的资源时,login.jsp拦截请求,将j_用户名和j_密码发送到服务器,在服务器上,用户经过身份验证和授权,可以获得该特定资源,并将其发送回客户端 在以下请求期间,j_username似乎不存储在任何位置(请求参数/属性、会话属性),但您可以通过调用request.getUserPrincipal().getName()获得该值 谁以及如何将该值与当前用户进行耦合?j_用户名真正存储在哪里?我的猜测是,应用程序服务器

我有一个web应用程序,它具有表单类型的身份验证机制,因此当用户请求一个受保护的资源时,
login.jsp
拦截请求,将
j_用户名
j_密码
发送到服务器,在服务器上,用户经过身份验证和授权,可以获得该特定资源,并将其发送回客户端

在以下请求期间,
j_username
似乎不存储在任何位置(请求参数/属性、会话属性),但您可以通过调用
request.getUserPrincipal().getName()
获得该值

谁以及如何将该值与当前用户进行耦合?
j_用户名
真正存储在哪里?我的猜测是,应用程序服务器正在跟踪这些对
[userid,sessionid]
,以便在调用
request.getUserPrincipal().getName()
时,它可以发回与当前会话相关联的userid


但这只是一个猜测,有人能证实/反驳吗?

Web服务器为每个登录的用户存储UserPrincipal对象。主体对象链接到sessionId。sessionId是存储在客户端的cookie的一部分。因此,每次用户访问资源时,都会匹配sessionId并检索相应的UserPrincipal对象。该实现依赖于Web服务器。对于tomcat,UserPrincipal对象是在Realm类中创建的

这就是解释

我的猜测是,应用服务器是跟踪对[userid,sessionid]的服务器,这样当调用request.getUserPrincipal().getName()时,它就可以发回与当前会话关联的userid

这在合同中没有具体规定。然而,基于
表单的身份验证的“事实”方法实际上可以归结为这一点。您还可以通过在使HTTP会话无效或过期时看到用户主体消失来轻松确认这一点

实际实现取决于所使用的servletcontainer。对于Tomcat,它存储在它的类中(表示内部
HttpSession
facade),该类有一个方法将
Principal
复制到每个
HttpServletRequest

它发生的地方是,在方法中。以下是相关内容摘录:

在第431行,您可以看到它是从HTTP会话中提取的(至少是Tomcat的内部外观,它不能通过公共API访问),在第440行,您可以看到它被设置在Tomcat的HTTP请求内部外观上,而Tomcat的HTTP请求内部外观又可以通过
HttpServletRequest#getUserPrincipal()
公开访问

如果您想知道如何以及何时调用
Session#setPrincipal()
,请转到同一类的方法

所有其他servletcontainer实现都有类似的方法

另见:

我已经读过这篇评论,但我想找一些更“正式”的东西,可能是一些实际的参考,如果它存在的话……一如既往的好答案。因此,我们可以说,从一个(不那么好奇的)程序员的角度来看,您需要知道和依赖的只是
Principal
对象很好地锚定到会话,只要您不使它无效。其余的都是特定于供应商的实现,对吗?
426         if (cache) {
427             Principal principal = request.getUserPrincipal();
428             if (principal == null) {
429                 Session session = request.getSessionInternal(false);
430                 if (session != null) {
431                     principal = session.getPrincipal();
432                     if (principal != null) {
433                         if (log.isDebugEnabled()) {
434                             log.debug("We have cached auth type " +
435                                 session.getAuthType() +
436                                 " for principal " +
437                                 session.getPrincipal());
438                         }
439                         request.setAuthType(session.getAuthType());
440                         request.setUserPrincipal(principal);
441                     }
442                 }
443             }
444         }