当使用容器管理的身份验证(看起来是你的情况)时,用户名被存储在容器安全上下文中。Servlet 规范提供了一个 API,允许访问包含用户名的用户主体(的实例java.security.Principal
)。
因此,一旦用户登录,您就可以使用java 代码中的用户HttpServletRequest.getUserPrincipal()
名或用户名访问用户主体。HttpServletRequest.getRemoteUser()
或与FacesContext.getCurrentInstance().getExternalContext().getRemoteUser()
要在 JSP/JSF 文件上使用它,您可以使用表达式语言以这种方式访问它:#{request.remoteUser}
如:
<h:inputText id="username" value="#{request.remoteUser}" />
加法:
您的用户支持 bean:
public class User implements Serializable {
private String name;
// other user attributes here
public String getName() {
return name;
}
}
添加 JSF 过滤器:
public class SetupUserFilter implements Filter {
public void init(FilterConfig config) { }
public void destroy() { }
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession(false);
if (session != null) {
User user = session.getAttribute("user");
if (user == null && request.getUserPrincipal() != null) {
// This means user has just logged in.
String username = request.getRemoteUser();
User user = ... // load the User instance from the database using the username
session.setAttribute("user", user);
}
}
chain.doFilter(req, res);
}
}
在你的配置你的过滤器web.xml
:
<filter>
<filter-name>SetupUserFilter</filter-name>
<filter-class>com.example.SetupUserFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SetupUserFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
然后总是依赖User
bean:
<h:inputText id="username" value="#{user.name}" />
免责声明:这只是一个示例,有点旧,因为它使用过滤器和其他方法也可能有效,但这种方法即使在非 JSF 环境中也有效。随意使用它,但要明白这不是获得所需内容的唯一方法。