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