java HttpServletRequest。getRemoteUser()与HttpServletRequest。getUserPrincipal()。getName() 1 年,2 月 Questions & Answers 53577 这两个人似乎在做同样的事情。有人能解释这两者的主要区别吗?你什么时候会用一个和另一个 HttpServletRequest.getRemoteUser() HttpServletRequest.getUserPrincipal().getName()
# 1 楼答案 与bit相关的问题: 将旧的IBMPortletAPI代码转换为JSR168的人必须在某些方法参数中将PortletRequest更改为HttpServletRequest,但随后从WPS6更改为HttpServletRequest。1及以上,他们无法将其强制转换为PortletRequest(它似乎不再实现相应的接口),如果他们直接在HttpServletRequest上调用“getRemoteUser”,则返回null(有人说Workaround是在WAS[WebSphere application Server]中启用应用程序安全选项)另一些人则表示,网络需要更多与安全相关的标记。(xml) 一个工作区似乎是使用PUMA,但这当然是特定于IBM WebSphere的。如果发现getRemoteUser总是返回null(从其他回复判断,然后是getUserPrincipal()),则可能在其他Portlet容器中存在其他特定于供应商的工作区。如果将getRemoteUser实现为该用户的快捷方式,则getName()也将返回null) 顺便说一句,我上面提到的PUMA代码就在这里,因为在WPS6中很难找到有效的代码。1+: import com.ibm.portal.portlet.service.PortletServiceHome; import com.ibm.portal.um.*; import com.ibm.portal.um.exceptions.PumaException; import com.ibm.portal.puma.User; //... public String getCurrentUser(){ try { Context ctx = new InitialContext(); Name myjndiname = new CompositeName(PumaHome.JNDI_NAME); PumaHome myHome = (PumaHome) ctx.lookup(myjndiname); if (myHome!=null) { PumaProfile pumaProfile = myHome.getProfile(); com.ibm.portal.um.User user = (com.ibm.portal.um.User)pumaProfile.getCurrentUser(); List attributes = new ArrayList(); attributes.add("uid"); Map userAttributes = pumaProfile.getAttributes(user,attributes); return (String) userAttributes.get("uid"); } }
# 2 楼答案 getUserPrincipal()方法返回从Principal接口派生的某个类的对象,该接口是负责请求的“用户”实体的抽象。从中您可以得到一个实际的对象,根据实现类的不同,您可以使用它来获取有关该用户/身份的各种信息。其中一个属性是用户/标识名称的字符串表示形式,您可以通过调用getName()获得该名称 getRemoteUser()实际上只是获取字符串表示的快捷方式。您无权访问实现类实现的任何其他方法,也无权访问对象本身,只能访问名称的字符串表示形式 对于我熟悉的大多数用例,字符串表示就是您想要的;我相信这就是getRemoteUser()存在的原因-这是一种常见的情况,因此有一种简单/快速的方法可以访问它,而不需要实际获取对实现类对象的引用
# 3 楼答案 Principal表示可能通过您的应用程序进行身份验证的人。主体的名称取决于所使用的身份验证方法: 用户名,如“fred”(在HTTP基本身份验证的情况下) 可分辨名称,如“CN=bob,O=myorg”(对于X.509客户机证书,可能返回X500Principal) getRemoteUser()返回“用户的登录名”,在HTTP基本身份验证的情况下,该登录名也将是用户名;但是,在X.509客户端证书案例中,它没有清晰地映射,因为用户没有输入“登录”这样的信息——在上面的示例中,我们可以使用可分辨名称,或者简单地使用CN“bob” Javadocs声明“是否随每个后续请求一起发送用户名取决于浏览器和身份验证类型”,这表明getRemoteUser()最初的意思是仅为输入用户名的请求提供数据。然而,当使用基于cookie的身份验证时,这将导致它对大多数请求返回null,这不是很有帮助 实际上,getRemoteUser()通常只是调用getUserPrincipal().getName();在Tomcat 6和Jetty 6/7中验证
# 1 楼答案
与bit相关的问题:
将旧的IBMPortletAPI代码转换为JSR168的人必须在某些方法参数中将PortletRequest更改为HttpServletRequest,但随后从WPS6更改为HttpServletRequest。1及以上,他们无法将其强制转换为PortletRequest(它似乎不再实现相应的接口),如果他们直接在HttpServletRequest上调用“getRemoteUser”,则返回null(有人说Workaround是在WAS[WebSphere application Server]中启用应用程序安全选项)另一些人则表示,网络需要更多与安全相关的标记。(xml)
一个工作区似乎是使用PUMA,但这当然是特定于IBM WebSphere的。如果发现getRemoteUser总是返回null(从其他回复判断,然后是getUserPrincipal()),则可能在其他Portlet容器中存在其他特定于供应商的工作区。如果将getRemoteUser实现为该用户的快捷方式,则getName()也将返回null)
顺便说一句,我上面提到的PUMA代码就在这里,因为在WPS6中很难找到有效的代码。1+:
# 2 楼答案
getUserPrincipal()
方法返回从Principal
接口派生的某个类的对象,该接口是负责请求的“用户”实体的抽象。从中您可以得到一个实际的对象,根据实现类的不同,您可以使用它来获取有关该用户/身份的各种信息。其中一个属性是用户/标识名称的字符串表示形式,您可以通过调用getName()
获得该名称getRemoteUser()
实际上只是获取字符串表示的快捷方式。您无权访问实现类实现的任何其他方法,也无权访问对象本身,只能访问名称的字符串表示形式对于我熟悉的大多数用例,字符串表示就是您想要的;我相信这就是
getRemoteUser()
存在的原因-这是一种常见的情况,因此有一种简单/快速的方法可以访问它,而不需要实际获取对实现类对象的引用# 3 楼答案
Principal
表示可能通过您的应用程序进行身份验证的人。主体的名称取决于所使用的身份验证方法:getRemoteUser()
返回“用户的登录名”,在HTTP基本身份验证的情况下,该登录名也将是用户名;但是,在X.509客户端证书案例中,它没有清晰地映射,因为用户没有输入“登录”这样的信息——在上面的示例中,我们可以使用可分辨名称,或者简单地使用CN“bob”Javadocs声明“是否随每个后续请求一起发送用户名取决于浏览器和身份验证类型”,这表明
getRemoteUser()
最初的意思是仅为输入用户名的请求提供数据。然而,当使用基于cookie的身份验证时,这将导致它对大多数请求返回null
,这不是很有帮助实际上,
getRemoteUser()
通常只是调用getUserPrincipal().getName()
;在Tomcat 6和Jetty 6/7中验证