我有一个登录页面,用户在其中输入用户名和密码:
<form method="post" action="j_security_check">
<p>You need to log in to access protected information.</p>
<table>
<tr>
<td>User name:</td>
<td><input type="text" name="j_username" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="j_password" /></td>
</tr>
</table>
<p><input type="submit" value="Login" /></p>
</form>
我现在要做的是使用已订阅的用户名,我想使用此用户名自动填充输入文本框,但不知道如何做到这一点,有什么想法吗?
使用容器托管身份验证时(似乎是这种情况),用户名存储在容器安全上下文中。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
豆:
<h:inputText id="username" value="#{user.name}" />
免责声明:这只是一个例子,有点旧,因为它使用过滤器和其他方法也可能有效,但即使在非 JSF 环境中,这个方法也有效。随意使用它,但要明白这不是获得所需内容的唯一方法。
首先,您必须定义一个受管 Bean 来存储用户的数据:
@Named
@SessionScoped
public class User implements Serializable {
private String name;
private String password;
public String getName() {
return name;
}
public String setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public String setPassword(String password) {
this.password = password;
}
}
当然,您必须为密码实现某种加密,但这只是为了演示如何创建简单的 bean。
接下来,您的表单将使用 EL(表达式语言)将用户输入设置为相应 bean 的字段:
<h:form>
<h3>Please enter your name and password.</h3>
<table>
<tr>
<td>Name:</td>
<td><h:inputText value="#{user.name}"/></td>
</tr>
<tr>
<td>Password:</td>
<td><h:inputSecret value="#{user.password}"/></td>
</tr>
</table>
<p><h:commandButton value="Login" action="hello"/></p>
</h:form>
最后,您可以在 hello.xhtml 页面上显示输入:
<h:head>
<title>Welcome</title>
</h:head>
<h:body>
<h3>Hello #{user.name}, your password is #{user.password}</h3>
</h:body>