HttpServletRequest.getRemoteUser() vs HttpServletRequest.getUserPrincipal().getName()

这两个人似乎在做同样的事情。谁能解释两者之间的主要区别?你什么时候会使用一个与另一个?

HttpServletRequest.getRemoteUser()

HttpServletRequest.getUserPrincipal().getName()


答案 1

A 表示可能通过应用程序进行身份验证的人员。主体的名称取决于所使用的身份验证方法:Principal

  • 用户名,如“fred”(在HTTP基本身份验证的情况下)
  • 可分辨名称,例如“CN=bob,O=myorg”(对于 X.509 客户端证书 - 在这种情况下,可能会返回 X500Principal

getRemoteUser()返回“用户的登录名”,在HTTP基本身份验证的情况下,它也将是用户名;但是,在 X.509 客户端证书案例中,它不会干净利落地映射,因为用户不会输入“登录名” - 在上面的示例中,我们可以使用可分辨名称或简称 CN ,“bob”。

Javadocs指出,“用户名是否随每个后续请求一起发送取决于浏览器和身份验证类型”,这表明最初只是为了输入用户名的请求提供数据。但是,这将导致它在使用基于cookie的身份验证时返回大多数请求 - 不太有帮助!getRemoteUser()null

实际上,通常只是打电话;在Tomcat 6和Jetty 6/7中验证。getRemoteUser()getUserPrincipal().getName()


答案 2

该方法返回从接口派生的某个类的对象,该对象是负责请求的“用户”实体的抽象。从中得到一个实际的对象,根据实现类的不同,您可以使用该对象来获取有关该用户/标识的各种信息。其中一个属性是用户/标识名称的字符串表示形式,您可以通过调用 来获取该表示形式。getUserPrincipal()PrincipalgetName()

getRemoteUser()实际上只是获取该字符串表示的快捷方式。您无权访问实现类实现的任何其他方法,也无权访问对象本身,只能访问名称的字符串表示形式。

对于我熟悉的大多数用例,字符串表示是你想要的;我相信这就是存在的原因 - 这是一个常见的情况,所以有一种简单/快速的方法来访问它,而无需实际获得对实现类对象的引用。getRemoteUser()